在我的module.config.php中,我有如下内容:
return [
'view_helpers' => [
'invokables' => [
'mycustomviewhelper' => 'Namespace'View'Helper'MyCustomViewHelper',
],
],
];
我也有一个实用程序类,将处理呈现一个帮助器的责任。比如Zend'Paginator.
Zend'Paginator有一个__toString()方法,代理渲染()调用,它实例化View'Renderer'PhpRenderer()
,然后调用$view->paginationControl($this)
。
我试图在我的实用程序类中复制类似的功能,它具有与Zend'Paginator已经做的类似的策略,唯一不同的是我的视图助手是自定义的。因此,我的代码看起来像:
$view->MyCustomViewHelper($this);
这不起作用,因为PhpRenderer忽略了手动定义的配置,并在getHelperPluginManager中执行以下操作:
$this->setHelperPluginManager(new HelperPluginManager());
我已经尝试调用已经在ViewHelperManager中定义的助手,这工作得很好。
我确实尝试事先合并配置,然后在视图中设置PhpRenderer,但这会导致其他问题,例如我的部分未找到等。
现在我的问题是为什么ZF不考虑任何自定义注册视图时,试图在孤立地呈现它。还有别的办法吗?
谢谢。
是的,经过一些调试和配置后,我能够使其工作。仍然不确定这是否是最好的方法,但目前看来没有其他方法可以让它工作。
我为实用程序类创建了一个工厂,实例化了PhpRenderer,然后在我的配置中手动合并了ViewPluginManager。我的工厂现在看起来像:
public function createService(ServiceLocatorInterface $serviceLocatorInterface)
{
$dataTable = new DataTable;
$phpRenderer = new PhpRenderer();
$config = new 'Zend'ServiceManager'Config([
'invokables' => [
'datatablerenderer' => 'DataTable'View'Helper'DataTableRenderer'
],
]);
$phpRenderer->setHelperPluginManager(new HelperPluginManager($config));
$dataTable->setView($phpRenderer);
return $dataTable;
}
然而,必须重构这一点,使配置来自view_helpers
配置键,而不是硬编码。