Как заменить PhpRenderer в приложении ZF2

Я расширил класс PhpRenderer в своем приложении ZF2 следующим образом:

namespace MyLib\View\Renderer; class PhpRenderer extends \Zend\View\Renderer\PhpRenderer { } 

Я не хочу добавлять новую стратегию рендеринга, я просто расширяю PhpRenderer, чтобы добавить некоторый phpdoc @method для моих наблюдателей .

Как заменить стандартный PhpRenderer на мой расширенный PhpRenderer, чтобы он использовался для рендеринга моих просмотров?

Средство рендеринга php – это сервис внутри диспетчера служб. Вы можете переопределить эту службу напрямую или выполнить ее через диспетчер представлений (который создает и настраивает средство визуализации).

Отменить службу

В вашем модуле вы определяете метод onBootstrap (). «Старый» рендерер php уже зарегистрирован, вы должны его переопределить.

 public function onBootstrap($e) { $app = $e->getApplication(); $sm = $app->getServiceManager(); $old = $sm->get('ViewRenderer'); $new = new MyCustomViewRenderer; $new->setHelperPluginManager($old->getHelperPluginManager()); $new->setResolver($old->getResolver()); $sm->setAllowOverride(true); $sm->setService('ViewRenderer', $new); $sm->setAllowOverride(false); } 

Переопределить диспетчер представлений

Существует альтернатива, где вы можете переопределить диспетчер представлений, где создается экземпляр php-рендеринга. Для этого вам нужно переопределить фабрику диспетчера просмотров:

В вашем приложении application.config.php (обратите внимание, что это конфигурация приложения , так как конфигурация модуля здесь не работает!)

 service_manager => array( 'factories' => array( 'HttpViewManager' => 'MyModule\Service\HttpViewManagerFactory', ), ); 

Затем создайте свой MyModule \ Service \ HttpViewManagerFactory:

 use MyModule\View\Http\ViewManager as HttpViewManager; class HttpViewManagerFactory implements FactoryInterface { /** * Create and return a view manager for the HTTP environment * * @param ServiceLocatorInterface $serviceLocator * @return HttpViewManager */ public function createService(ServiceLocatorInterface $serviceLocator) { return new HttpViewManager(); } } 

И тогда вы можете, наконец, обновить фабрику самого рендеринга php:

 use Zend\Mvc\View\Http\ViewManager as BaseViewManager; class ViewManager extends BaseViewManager { public function getRenderer() { if ($this->renderer) { return $this->renderer; } $this->renderer = new MyCustomViewPhpRenderer; $this->renderer->setHelperPluginManager($this->getHelperManager()); $this->renderer->setResolver($this->getResolver()); $model = $this->getViewModel(); $modelHelper = $this->renderer->plugin('view_model'); $modelHelper->setRoot($model); $this->services->setService('ViewRenderer', $this->renderer); $this->services->setAlias('Zend\View\Renderer\PhpRenderer', 'ViewRenderer'); $this->services->setAlias('Zend\View\Renderer\RendererInterface', 'ViewRenderer'); return $this->renderer; } } 

Вывод

Первый метод уже создает стандартный рендеринг php, поэтому вы создаете экземпляр двух из них и заменяете по умолчанию свой собственный.

Альтернативой является обход создания экземпляра рендеринга php Zend по умолчанию, но вы должны сделать это в классе диспетчера представлений. Проблема здесь в том, что вы должны переопределить завод для диспетчера представлений. Это звучит как объезд, но это единственный способ сделать это.

Если весь ваш собственный класс содержит объявления @method вам не нужно заменять класс рендеринга php. Просто убедитесь, что вы используете @var блок @var и ваша IDE будет знать, что делать:

Документируйте тип переменной $this в ваших файлах просмотра:

 <!-- in a view file --> <?php /* @var $this MyLib\View\Renderer\PhpRenderer */ ?> <?= $this->myCustomViewHelper() ?> 

Документировать отдельные переменные или свойства для помощников, классов и т. Д.

 class SomeHelper extends AbstractHelper { /** @var \MyLib\View\Renderer\PhpRenderer */ protected $view; public function __invoke() { $this->view->myCustomViewHelper(); } }