На моем 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 не учитывает какие-либо пользовательские зарегистрированные представления при попытке отрисовки его изолированно? Есть ли другой способ сделать это?
Спасибо.
Правильно, после небольшой отладки и игры с конфигами, я смог сделать эту работу. Все еще не уверен, что это лучший способ сделать это, но похоже, что в настоящее время нет другого способа заставить его работать.
Я создал фабрику для служебного класса, создал экземпляр 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
Конфигурационный ключ и не является жестко закодированным.
Других решений пока нет …