ZF2视图插件管理器没有合并配置

时间:2015-05-25 09:02:08

标签: php zend-framework pagination view-helpers

在我的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在尝试单独呈现它时不考虑任何自定义注册视图。有没有其他方法可以做到这一点?

谢谢。

1 个答案:

答案 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配置密钥而且不是硬编码。