这是Cgiapp2教程系列中的第二篇。在本教程中,我将介绍如何创建我称之为“可插入应用程序”的应用程序,这些应用程序可以分发和自定义以与其他站点一起使用。
背景
多年来,在我担任过的多个职位中,我需要在多个站点上使用同一个应用程序并稍作修改。其中包括文章申请、画廊、联系表等。底层代码通常保持不变—但我可能需要将内容插入不同的站点范围模板,或者需要身份验证。
当很好地遵循MVC时,其中许多任务已经很容易了。您可以随意创建控制器的新实例,并插入新模板以自定义外观。但是,诸如站点范围模板之类的东西不在应用程序模板的范围之内;它们专为套件应用程序而设计。身份验证通常也非常依赖站点;当然,您的应用程序可能需要登录用户,但您真的应该规定使用什么凭据吗?这不应该留给网站所有者吗?
一个好的控制器可以提供这种灵活性。使用Cgiapp2的回调挂钩系统,您实际上不需要开发应用程序来完成其中的一些任务;相反,您可以将其留给最终用户开发人员来实施。这为您的应用程序提供了强大的可移植性和令人难以置信的灵活性。
示例1:向全站模板添加内容
我需要承担的最常见任务之一是将应用程序生成的内容添加到站点范围的模板中。在Cgiapp中,您可以通过cgiapp_postrun()执行此操作。cgiapp_postrun()在应用程序逻辑完成后执行,并接收生成的内容作为其第一个参数:
public function cgiapp_postrun($body, $cgiapp)
{
$cgiapp->tmpl_assign('content', $body);
return $cgiapp->load_tmpl('site.phtml');
}
但是,如果您在应用程序逻辑中执行此操作,您就是在为应用程序的后续用户做决定。别管它了。相反,让最终用户开发人员注册他们自己的运行后挂钩来执行此操作。例如:
require_once 'Cgiapp2.class.php';
require_once 'My/Article.php';
class OurSite
{
public static function postrun($body, Cgiapp2 $cgiapp)
{
$cgiapp->tmpl_assign('content', $body);
return $cgiapp->load_tmpl('site.phtml');
}
}
Cgiapp2::add_callback('postrun', array('OurSite', 'postrun'), 'My_Article');
$app = new My_Article($options);
$app->run();
开发人员现已在My_Article应用程序中注册了一个“postrun”挂钩。当应用程序流遇到postrun事件时,它将触发OurSite::postrun(),然后它可以操作内容,将其放入开发人员的站点范围模板中。
示例2:添加身份验证
如果文章应用程序不需要身份验证,但作为最终用户开发人员,您想要编辑、添加和删除视图时需要它怎么办?注册预运行操作。使用上面的示例:
require_once 'Cgiapp2.class.php';
require_once 'My/Article.php';
class OurSite
{
protected static function _validate($user, $pass)
{
// ... validate user ...
}
public static function prerun($action, Cgiapp2 $cgiapp)
{
if (in_array($action, array('add', 'edit', 'delete')) {
// Need to authenticate...
require_once 'Phly/Auth.php';
$auth = new Phly_Auth(array(self, '_validate'));
$auth->start();
if (!$auth->isValid) {
// reset to the default entry for the app
$cgiapp->prerun_mode($cgiapp->start_mode());
return;
}
}
}
public static function postrun($body, Cgiapp2 $cgiapp)
{
$cgiapp->tmpl_assign('content', $body);
return $cgiapp->load_tmpl('site.phtml');
}
}
Cgiapp2::add_callback('prerun', array('OurSite', 'prerun'), 'My_Article');
Cgiapp2::add_callback('postrun', array('OurSite', 'postrun'), 'My_Article');
$app = new My_Article($options);
$app->run();
上面的示例使用了Phly_Auth,但也可以很容易地使用其他身份验证机制。
预运行挂钩在运行请求的操作之前执行,并接收请求的操作作为其第一个参数。在上面的代码中,我们检查操作是否需要身份验证,如果需要,则检查用户的凭据。如果他们未通过身份验证,我们会将操作重置为默认输入操作。
总结
Cgiapp2的回调挂钩系统为最终用户开发人员提供了难以置信的机会,可以在每个实例的基础上自定义应用程序。本教程涵盖了两个挂钩,预运行和后运行,但还有更多挂钩可用,Cgiapp2提供了在您的应用程序中创建额外挂钩的方法。
有关此主题的更多信息,请参阅回调挂钩文档。
