1

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

我知道如何通过扩展为 Controller 编写插件

Zend\Mvc\Controller\Plugin\AbstractPlugin 类

并且还知道通过扩展为 View 编写插件很热门

Zend\View\Helper\AbstractHelper 类。

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

4

3 回答 3

6

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

一个非常 hacky 的替代方法是创建一个控制器插件,然后通过控制器插件管理器请求您的控制器插件,该控制器插件管理器可从 ServiceManager 获得。当然 View 插件需要ServiceManagerAwareInterface访问 ServiceManager。

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

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

于 2012-10-11T11:50:06.693 回答
1

你不能。正如您所说的那样,控制器插件和视图助手扩展了不同的类,这使得它们彼此不兼容。

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

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

注意:我认为我的回答相当笼统——我并没有真正考虑到你到底想要做什么(换句话说:我没有考虑为 Date 函数创建一个包装器是否有意义)。如果我的回答不适合您的问题,请随时更详细地说明您的问题。

于 2012-10-11T11:43:17.843 回答
0

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

于 2012-10-12T01:51:05.187 回答