Я расширил класс 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(); } }