在我的module.config.php上我有类似的东西:
return [
'view_helpers' => [
'invokables' => [
'mycustomviewhelper' => 'Namespace\View\Helper\MyCustomViewHelper',
],
],
];
我还有一个实用程序类,它将负责渲染帮助程序。像Zend \ Paginator这样的东西。
Zend \ Paginator有一个__toString()方法,代理render()调用,实例化View\Renderer\PhpRenderer()
,然后调用$view->paginationControl($this)
。
我正在尝试复制我的实用程序类中的类似功能,它与Zend \ Paginator已经执行的策略类似,唯一不同的是我的视图助手是自定义的。因此,我的代码如下:
$view->MyCustomViewHelper($this);
这不起作用,因为PhpRenderer忽略手动定义的配置并在getHelperPluginManager中执行以下操作:
$this->setHelperPluginManager(new HelperPluginManager());
我已尝试调用已在ViewHelperManager中定义的帮助程序,这很有效。
我确实尝试先在配置中合并,然后在视图中设置PhpRenderer,但这会导致其他问题,例如找不到部分内容等。
现在我的问题是为什么ZF在尝试单独呈现它时不考虑任何自定义注册视图。有没有其他方法可以做到这一点?
谢谢。
答案 0 :(得分:0)
是的,经过一些调试,并使用配置,我能够做到这一点。仍然不确定这是否是最好的方法,但看起来目前没有其他方法可以使它工作。
我为实用程序类创建了一个工厂,实例化了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
配置密钥而且不是硬编码。