有一些人与我联系表示对Cgiapp感兴趣,而且我注意到我设置的freshmeat项目有很多订阅者。此外,我们在国家园艺协会广泛使用该库来开发我们的新闻网站(当前网站混合使用ASP和Tango,还有几个使用PHP的较新应用程序)。我也一直在监视CGI::Application
邮件列表。作为所有这些活动的结果,我决定我需要为Cgiapp制定路线图。
目前,计划中的更改包括:
-
版本1.x系列:
- 为
stripslashes
添加Smarty注册(Smarty“功能”callwillbesslashes
). param()
错误修复:目前,调用param()
时不带任何参数simplygives您使用该方法注册的参数列表,但不是它们的值;这将被修复。error_mode()
方法。CGI::Application
ML提出并实现了error_mode()
方法的想法,以向对象注册一个error_mode
(类似于运行模式())。虽然不是必需的,但它会提供用于错误处理的标准内置挂钩。
$PATH_INFO
遍历。同样,在CGI::App
ML上,请求内置支持使用$PATH_INFO
来确定运行模式。基本上,您将传递一个参数指示$PATH_INFO
字符串中的哪个位置保存运行模式。- DocBook教程。我觉得类级别的文档中提供了太多信息,需要编写使用教程。由于我使用PhpDoc进行文档编写并以PEAR为目标,因此将教程移至DocBook是合乎逻辑的步骤。
- 为
-
Version2.x系列:
是的,一个Cgiapp2在未来。有一些更改需要(a)PHP5或(b)API更改。为了与PEAR准则保持一致,我将重命名模块Cgiapp2,以免破坏为Cgiapp设计的应用程序。
预期的更改包括:
-
继承自PEAR。这将允许一些内置的错误处理,等等。我怀疑这将与
error_mode()
配合使用,并且可能还会弃用croak()
和carp()
。 -
对
tmpl_path()
和load_tmpl()
的更改。在perl版本中,您将使用load_tmpl()
实例化一个模板,将变量分配给它,然后对其执行fetch()
。所以,这个:$this->tmpl_assign('var1', 'val1'); $body = $this->load_tmpl('template.html');
变成这个:
$tmpl = $this->load_tmpl(); $tmpl->assign('var1', 'val1'); $body = $tmpl->fetch('template.html');
或者
$tmpl = $this->load_tmpl('template.html'); $tmpl->assign('var1', 'val1'); $body = $tmpl->fetch();
(两个示例都假定使用Smarty。)出于以下几个原因,我想恢复到此行为:
-
perl的可移植性。这是PHP和perlversions差异很大的一个领域;采用perl方式使两种语言之间的类移植更简单。
-
解耦。当前的模板方法集创建一个对象作为应用程序对象的参数——这很好,除非模板对象实例化器返回不同类型的对象。
缺点:
-
Smarty可以使用同一个对象来填充多个模板,当前的方法就是利用了这一点。通过将模板对象本地分配给每个方法,这可能会丢失。但是……一个简单的解决方法是让
load_tmpl()
创建对象并将其存储为一个参数;后续调用将返回相同的对象引用。如果load_tmpl()
假定模板名称将被传递,则困难在于。然而,即使在CGI::App
中,您也可以决定一个模板引擎并为该引擎进行设计;从来没有假设模板引擎应该是可交换的。 -
现有的Cgiapp1应用程序需要重写。
-
-
-
PluginArchitecture:
CGI::App
ML产生了一个::Plugin
使用通用插件架构的命名空间。它在perl中的完成方式是通过一些神奇的命名空间和导出例程……值得注意的是,这两者在PHP中都没有。但是,如果我使用PHP5,我想我可能知道一个解决方法:themagic
__call()
重载方法。我的想法是让插件类注册方法,基于Cgiapp的类应该可以访问
$_GLOBALS数组。然后,
__call()
方法将检查已注册方法的键;如果发现一个匹配请求的方法,则调用该方法(使用call_user_func()
),并将基于Cgiapp的对象引用作为第一个引用。瞧!即时插件!为什么要这样做?然后可以创建“标准”插件库,例如:
- 表单验证插件
- 替代模板引擎作为插件(而不是覆盖
tmpl_*
方法) - 授权插件
由于“导出”的方法可以访问Cgiapp对象,它们甚至可以向其注册对象或参数.
-
如果您对路线图有任何要求或意见,请随时与我联系。