Zend Framework 中的插件之二:使用插件

来源:互联网 发布:linux显示文件内容 编辑:程序博客网 时间:2024/05/16 16:57

使用插件的组件通常用 Zend_Loader_PluginLoader 来完成工作。这个类通过指定一个或多个前缀路径使你注册插件。然后组件将调用 PluginLoader 的 load() 方法,把插件的短名字传递给它。PluginLoader 然后会查询每一个前缀路径,来看是否有一个和短名字匹配的类存在。前缀路径按照 LIFO (last in, first out) 的顺序被搜索,所以它将首先匹配最后注册的前缀路径——这就允许你重写已经存在的插件。

一些例子将会使这些更清楚。

例一 基本插件举例:增加一个单独前缀路径

在这个例子中,我们将假设一些过滤器已经写好,并且放置在 foo/plugins/validators/ 目录中,所有这些类共享 Foo_Validate_ 这个类前缀,这两个信息组成了我们的前缀路径。让我们进一步假设我们有两个过滤器,一个名字是 Even (让一个偶数合法),另外一个被命名 Dozens (使一个12的倍数合法)。树状图看起来将会是这样的:

foo/

|-- plugins/

| |-- validators/

| | |-- Even.php

| | |-- Dozens.php

现在,我们将把这个前缀路径通知给一个 Zend_Form_Element 实例。Zend_Form_Element 的 addPrefixPath() 方法将等待一个第三参数,这个参数指明了插件的类型,正在被注册的路径,在这个例子中,它是一个 validate 插件。

现在我们只需简单的把我们想使用的过滤器的短名字告诉 element。在下面的例子中,我们混合使用了标准的过滤器(NotEmpty,Int)和定制的过滤器(Even,Dozens):

当 element 需要验证的时候,它将从 PluginLoader 请求插件类。最先的两个验证器将会分别解析到 Zend_Validate_NotEmpty 和 Zend_Validate_Int,后面的两个将会分别解析到 Foo_Validate_Even 和 Foo_Validate_Dozens。

注意:如果一个插件没有找到会发生什么?

如果一个插件被请求,但是 PluginLoader 却不能找到一个与之匹配的类,这时会有什么发生?举例来说,在上面的例子中,如果我们在 element 上注册了 Bar 这个插件,将会有什么情况发生?

插件的加载器会查找每一个前缀路径,来查看在那个路径上是否有一个和插件名字相匹配的文件存在。如果没有找到这个文件,它将移动到下一个前缀路径。当前缀路径的堆栈被穷尽,没有找到相匹配的文件,它会抛出一个异常 Zend_Loader_PluginLoader_Exception。

例子二 中级插件应用:重写存在的插件

PluginLoader 的一个作用是:它使用 LIFO 堆栈让你可以重写已经存在的类。重写的方法是,使用一个不同的本地路径前缀,并且把这个前缀路径之后注册到这个堆栈的后部。来创建一个你自己版本的插件。

举例来说,让我们想一下 Zend_View_Helper_FormButton (视图帮助器是插件的一种形式)。这个视图帮助器接受三个参数,一个元素的名字(同时也被当作元素的 DOM 识别符),一个值(被当作按钮标签使用),和一个可选的属性数组。帮助器然后为一个表单的 input 元素产生 HTML 标记。

让我们假设你想这个让这个帮助器产生一个真实的 HTML button 元素;不想让这个帮助器产生一个 DOM 标识符,而是为一个 CSS 类选择器使用一个值;而且你对处理任意的属性没有兴趣。达到这个目的,你有几种方法。在两个例子中,你得创造自己的视图帮助器类来完成你想要的行为,区别是,你将如何命名以及引用它们。

我们的第一个例子将会是用一个唯一的名字 Foo_View_Helper_CssButton 来命名这个元素,这将暗示插件的名字是 CssButton。这当然是切实可行的方法,它却会产生几个问题:如果你在你的代码中已经使用了 Button 视图帮助器,你现在不得不重构;或者,另外一个开发者为你的应用程序开始写代码,他们将不经意的使用 Button 视图帮助器,而不是你的新的视图帮助器。

所以,更好的例子是给我们的 Foo_View_Helper_Button 使用 Button 这个插件名。我们然后把前缀路径注册到视图上:

一旦完成,你在任何地方使用 Button 帮助器将会引用你定制的 Foo_View_Helper_Button 类。

原创粉丝点击