在我的上一篇文章中,我写了如何开始使用Zend_Application
,包括一些关于如何编写资源方法的信息,以及列出可用的资源插件。当您需要一个没有现有插件的可重用资源时会发生什么?为什么,当然是自己写!
ZendFramework中的所有插件都遵循一个通用模式。基本上,您将插件分组在一个公共目录下,使用一个公共类前缀,然后通知可插入类它们的位置。
对于这篇文章,让我们考虑一下您可能希望资源插件执行以下操作:
- 设置视图文档类型
- 设置默认页面标题和标题分隔符
开始
首先,让我们确定要使用的类前缀。如果我们遵循ZendFramework编码标准,我们可以利用自动加载,同时确保我们的资源有一个通用的类前缀。
出于本练习的目的,我们将使用类前缀Phly_Resource
,它位于include_path
的Phly/Resource/
中。
我们将我们的特定资源称为“Layouthelpers”,其完整类名为Phly_Resource_Layouthelpers
,并将其放在Phly/Resource/Layouthelpers.php
中。它需要实现Zend_Application_Resource_Resource
,但扩展Zend_Application_Resource_ResourceAbstract
通常更容易。在这两种情况下,您都需要定义一个init()
方法。让我们相应地设置我们的骨架:
<?php // Phly/Resource/Layouthelpers.php // class Phly_Resource_Layouthelpers extends Zend_Application_Resource_ResourceAbstract { public function init() { } }
关于依赖跟踪
在我之前的文章中,我在Zend_Application
中展示了一个依赖跟踪的例子。我们在本练习中也将需要它,因为我们的两个任务都对视图对象进行操作,我们将通过视图资源检索视图对象。
当直接在您的引导程序中创建资源方法时,您可以简单地调用$this->getResource($name)
。但是,在插件资源类中,您需要首先访问引导程序对象本身—您可以使用getBootstrap()
方法。
让我们确保View资源已初始化,并检索它。
<?php // Phly/Resource/Layouthelpers.php // class Phly_Resource_Layouthelpers extends Zend_Application_Resource_ResourceAbstract { public function init() { $bootstrap = $this->getBootstrap(); $bootstrap->bootstrap('View'); $view = $bootstrap->getResource('View'); // ... } }
配置资源
现在我们已经有了我们的视图对象,我们可以做一些工作了。由于我们希望资源可重用,我们应该允许一些配置选项。Zend_Application_Resource_ResourceAbstract
提供了一些样板功能来实现这一点。
首先,我们将通过$_options
属性提供一些默认选项。
<?php // Phly/Resource/Layouthelpers.php // class Phly_Resource_Layouthelpers extends Zend_Application_Resource_ResourceAbstract { protected $_options = array( 'doctype' => 'XHTML1_STRICT', 'title' => 'Site Title', 'title_separator' => ' :: ', ); public function init() { $bootstrap = $this->getBootstrap(); $bootstrap->bootstrap('View'); $view = $bootstrap->getResource('View'); // ... } }
然后我们可以使用getOptions()
方法获取选项。
<?php // Phly/Resource/Layouthelpers.php // class Phly_Resource_Layouthelpers extends Zend_Application_Resource_ResourceAbstract { protected $_options = array( 'doctype' => 'XHTML1_STRICT', 'title' => 'Site Title', 'title_separator' => ' :: ', ); public function init() { $bootstrap = $this->getBootstrap(); $bootstrap->bootstrap('View'); $view = $bootstrap->getResource('View'); $options = $this->getOptions(); // ... } }
现在,在配置文件中,开发人员可以覆盖默认值:
[production] ; ... resources.layouthelpers.doctype = "HTML5" resources.layouthelpers.title = "My Snazzy New Website" resources.layouthelpers.title_separator = " &emdash; "
做一些工作
现在我们已经了解了命名和配置的细节,让我们做一些工作:
<?php // Phly/Resource/Layouthelpers.php // class Phly_Resource_Layouthelpers extends Zend_Application_Resource_ResourceAbstract { protected $_options = array( 'doctype' => 'XHTML1_STRICT', 'title' => 'Site Title', 'title_separator' => ' :: ', ); public function init() { $bootstrap = $this->getBootstrap(); $bootstrap->bootstrap('View'); $view = $bootstrap->getResource('View'); $options = $this->getOptions(); $view->doctype($options['doctype']); $view->headTitle()->setSeparator($options['title_separator']) ->append($options['title']); } }
就是这样!
向Bootstrap介绍我们
好吧,插件资源就是这样。但是我们如何告诉我们的引导程序类呢?通过我们的配置文件,使用“pluginPaths”键。这是一个数组,键是插件类前缀,值是对应于该前缀的路径。
[production] ; ... pluginPaths.Phly_Resource = "Phly/Resource" resources.layouthelpers.doctype = "HTML5" resources.layouthelpers.title = "My Snazzy New Website" resources.layouthelpers.title_separator = " &emdash; "
您可以根据需要注册任意数量的插件路径。由于在处理任何资源之前处理此密钥,因此也可以随时在您的配置中定义它。
进一步的考虑
这篇文章中的例子无可否认是微不足道的。没有讨论的一个方面是创建一个可以在整个应用程序中重复使用的资源。例如,您可能想要创建一个资源,您将在应用程序的不同时间使用它。如果您在init()
方法中返回一个值,bootstrapobject将存储该值供以后检索。我们之前看到的一个很好的例子:View资源通过从它的资源插件返回实例简单地向引导程序注册一个Zend_View
对象。
结论
希望这篇博文和之前的博文有助于阐明Zend_Application
,特别是如何编写和引导资源。
如果您还有其他问题,可以在ZF邮件列表、通过Freenode服务器在IRC上或在Twitter上找到我。祝你好运!