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 中(注意它是 application 配置,因为模块配置在这里不起作用!)
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 渲染器,所以你实例化了其中两个并用你自己的替换默认值。
另一种方法是绕过默认 Zend 的 php 渲染器的实例化,但您必须在视图管理器类中执行此操作。这里的问题是您还必须为视图管理器重新定义工厂。这听起来像是绕道而行,但这是完成此任务的唯一方法。