php - 如何替换 ZF2 应用程序中的 PhpRenderer

标签 php zend-framework2

我在 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/

相关文章:

php - 将 SQL 日期格式化为 UK 格式

php - 如何获取单选按钮的值以便可以操作该值

php - 搜索工作正常,只有第一个结果未显示

zend-framework2 - 如何使用 Zend Framework 2 中的安全功能?

php - 关于ZF-Oauth "official"database schema的问题

php - 我想在 mysql 中更新第二个表时自动更新表

php - 从 array_rand 函数的结果创建简码

testing - ZF2。替代让 AbstractController(或其他类)实现 ServiceLocatorAwareInterface?

php - 未捕获异常 'Zend\ModuleManager\Exception\RuntimeException',消息为“模块(相册)无法初始化

php - Zend Framework 2-处理空值的列(float 类型)