在我的 ZF2 应用程序中,我正在尝试编写一个插件来提供 PHP 日期实用程序的包装器。我计划这个插件将有 api 来初始化、转换和检索日期值。
我知道如何通过扩展为 Controller 编写插件
Zend\Mvc\Controller\Plugin\AbstractPlugin 类
并且还知道通过扩展为 View 编写插件很热门
Zend\View\Helper\AbstractHelper 类。
但是我们如何编写一个在 Controller 和 View 中都可以使用的插件呢?
在我的 ZF2 应用程序中,我正在尝试编写一个插件来提供 PHP 日期实用程序的包装器。我计划这个插件将有 api 来初始化、转换和检索日期值。
我知道如何通过扩展为 Controller 编写插件
Zend\Mvc\Controller\Plugin\AbstractPlugin 类
并且还知道通过扩展为 View 编写插件很热门
Zend\View\Helper\AbstractHelper 类。
但是我们如何编写一个在 Controller 和 View 中都可以使用的插件呢?
我会编写一个可以从 ServiceManager 检索的类(工厂或可调用),并让两种插件类型都访问这个类。这允许您将逻辑和功能保留在单个类中,Zend Navigation 采用类似的方法,将导航数据存储在助手之间共享的工厂类中。
一个非常 hacky 的替代方法是创建一个控制器插件,然后通过控制器插件管理器请求您的控制器插件,该控制器插件管理器可从 ServiceManager 获得。当然 View 插件需要ServiceManagerAwareInterface访问 ServiceManager。
$plugin = $this->getServiceManager()->get('ControllerPluginManager')->get('myplugin');
然后将__invoke()参数传递给插件。虽然这是可行的,但第一种方法要好得多。
你不能。正如您所说的那样,控制器插件和视图助手扩展了不同的类,这使得它们彼此不兼容。
此外,将控制器插件与视图助手混合使用也没有什么意义,因为它们都实现了完全不同的目的。控制器插件用于执行业务逻辑的常用部分,视图助手提供可重用的视图逻辑。
我建议创建一个能够进行日期转换(或任何您需要的)的类,并创建一个原子视图助手以所需格式呈现日期(使用此类)。但是,我不一定要为此创建控制器插件,因为您可以使用服务管理器轻松检索此类的实例。
注意:我认为我的回答相当笼统——我并没有真正考虑到你到底想要做什么(换句话说:我没有考虑为 Date 函数创建一个包装器是否有意义)。如果我的回答不适合您的问题,请随时更详细地说明您的问题。
如果您使用的是 php 5.4,请考虑创建一个在插件和视图助手中使用的特征。