How to override default PhpRenderer in ZF3 MVC

zend-mvc
zend-view

#1

Hello,

plase how i can override PhpRenderer in ZF3 ? I need it to add some special dynamic logic …

What i did currently, but it doesn’t work at all (looks Zend\Mvc ignores this setting)

1/ i added to config/application.config.php

    'service_manager' => [
        'factories' => [
            \Application\View\Renderer\PhpRenderer::class => \Application\View\Renderer\Factory\PhpRendererFactory::class,
        ],
        'aliases' => [
            'ViewPhpRenderer'                            => \Application\View\Renderer\PhpRenderer::class,
            'ViewRenderer'                               => \Application\View\Renderer\PhpRenderer::class,
            'Zend\View\Renderer\RendererInterface'       => \Application\View\Renderer\PhpRenderer::class,
        ]
    ]

2/ added modules/Application/src/View/Renderer/PhpRenderer.php

<?php

namespace Application\View\Renderer;

class PhpRenderer extends \Zend\View\Renderer\PhpRenderer
{
	// .... later some stuff will be here
}

3/ added modules/Application/src/View/Renderer/Factory/PhpRendererFactory.php

<?php

namespace Application\View\Renderer\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\View\Renderer\PhpRenderer;

class PhpRendererFactory implements FactoryInterface
{
	/**
	 * @param  ContainerInterface $container
	 * @param  string $name
	 * @param  null|array $options
	 * @return PhpRenderer
	 */
	public function __invoke(ContainerInterface $container, $name, array $options = null)
	{
		$renderer = new PhpRenderer();
		$renderer->setHelperPluginManager($container->get('ViewHelperManager'));
		$renderer->setResolver($container->get('ViewResolver'));

		return $renderer;
            }
}

But it odesn’t work … Mvc still uses Zend\View\Renderer\PhpRenderer instead of my Application\View\Renderer\PhpRenderer

Anybody can help me ? Thanks for any advice …


#2

Internally, Zend\Mvc\Service\ViewPhpRendererStrategyFactory pulls the renderer using the service name Zend\View\Renderer\PhpRenderer; if you assign your custom factory to that particular service name, you should be set.


#3

Thanks for tip but this doesn’t work :frowning:

Tried this in application.config.php (and also in module.config.php), without success, MVC is still using it’s factory, not mine…

    'service_manager' => [
        'factories' => [
            'Zend\View\Renderer\PhpRenderer' => \Application\View\Renderer\Factory\PhpRendererFactory::class,
        ],
    ]

#4

Where are you registering your factory? This may be an issue of order of precedence…


#5

tried put it to config/application.config.php (i need override renderer in all application modules so i guess this is good place)


#6

I was working with skeleton and did a quick test. Default renderer was successfully overridden by custom one using Zend\View\Renderer\PhpRenderer key in module config.


#7

that’s strange… can you please provide exactly which code you placed where ? i will try do exactly same…


#8

All I did was adding:

'service_manager' => [
	'factories' => [
		'Zend\View\Renderer\PhpRenderer' => Application\Factory\PhpRendererFactory::class
	]
],

here: https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php#L14


#9

AAh finally i found what was problem… this is really strange. . it was working from very beginning … reason why i thought it is not working is, that when there is exception because of missing template file, it throws this:

File:
/**********/vendor/zendframework/zend-view/src/Renderer/PhpRenderer.php:497

Message:
Zend\View\Renderer\PhpRenderer::render: Unable to render template “back-office/custom/index/index”; resolver could not resolve to a file

So it looks like template is rendererd by default zend rendere - but it is NOT ! - when i put die() into my overrided renderer redner() method, i realized that it IS actually called :slight_smile:

Strange… anyway, thanks for help !!