我在 ZF2 应用程序中扩展了 PhpRenderer 类,如下所示:
namespace MyLib\View\Renderer;
class PhpRenderer extends \Zend\View\Renderer\PhpRenderer
{
}
我不想添加新的渲染策略,我只是将 PhpRenderer 扩展为 add some @method phpdoc for my viewhelpers 。
如何用扩展的 PhpRenderer 替换标准 PhpRenderer,以便将其用于渲染我的 View 脚本?
最佳答案
php 渲染器是服务管理器中的一个服务。您可以直接覆盖此服务或通过 View 管理器(它实例化并配置渲染器)来执行此操作。
覆盖服务
在您的模块中,您定义一个 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);
}
覆盖 View 管理器
还有一种替代方法,您可以重新定义实例化 php 渲染器的 View 管理器。您必须为此重新定义 View 管理器的工厂:
在你的 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 渲染器,因此您实例化其中两个并将默认值替换为您自己的。
另一种方法是绕过默认 Zend 的 php 渲染器的实例化,但您必须在 View 管理器类中执行此操作。这里的问题是您还必须为 View 管理器重新定义工厂。这听起来像是一条弯路,但这是完成此任务的唯一方法。
关于php - 如何替换 ZF2 应用程序中的 PhpRenderer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20194053/