在ZF2中,如何在Controller和View中编写单个插件?

时间:2012-10-11 09:44:35

标签: zend-framework2

在我的ZF2应用程序中,我正在尝试编写一个插件来提供PHP Date实用程序的包装器。我已经计划过这个插件会有apis来初始化,转换和检索日期值。

我知道如何通过扩展

为Controller编写插件
  

Zend \ Mvc \ Controller \ Plugin \ AbstractPlugin类

并且也知道通过扩展

为View编写插件
  

Zend \ View \ Helper \ AbstractHelper类。

但是我们如何编写一个可以在Controller和View中使用的插件?

3 个答案:

答案 0 :(得分:6)

我会编写一个可以从ServiceManager中检索的类(工厂或可调用的),并允许两个插件类型访问此类。这允许您将逻辑和功能保存在单个类中,Zend Navigation采用类似的方法,将导航数据存储在助手之间共享的工厂类中。

一个非常糟糕的选择是创建一个Controller插件,然后通过可以从ServiceManager获得的控制器插件管理器请求您的控制器插件。当然,View插件需要ServiceManagerAwareInterface才能访问ServiceManager。

$plugin = $this->getServiceManager()->get('ControllerPluginManager')->get('myplugin');

然后将__invoke()参数传递给插件。虽然这是可行的,但第一种方法要好得多。

答案 1 :(得分:1)

你做不到。正如您所说的那样,控制器插件和浏览器扩展了不同的类,这使得它们彼此不兼容。

此外,将控制器插件与视图助手混合是没有意义的,因为它们都实现了完全不同的目的。控制器插件用于执行业务逻辑的常用部分,然后提供可重用的视图逻辑。

我建议创建一个能够进行日期转换的类(或者你需要的任何东西)并创建一个原子视图助手来以所需的格式呈现日期(使用这个类)。但是,我不一定要为此创建一个控制器插件,因为您可以使用服务管理器轻松检索此类的实例。

注意:我认为我的答案相当笼统 - 我还没有真正考虑到你究竟要做什么(换句话说:我没想到创建一个包装器是否有意义对于日期函数)。如果我的答案不适合您的问题,请随时更详细地陈述您的问题。

答案 2 :(得分:0)

如果您使用的是PHP 5.4,请考虑创建一个在插件和视图助手中使用的特征。