dendy
July 6, 2017, 3:02pm
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 …
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.
dendy
July 7, 2017, 6:24am
3
Thanks for tip but this doesn’t work
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,
],
]
Where are you registering your factory? This may be an issue of order of precedence…
dendy
July 10, 2017, 12:42pm
5
tried put it to config/application.config.php (i need override renderer in all application modules so i guess this is good place)
cpm
July 10, 2017, 6:54pm
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.
dendy
July 10, 2017, 7:07pm
7
that’s strange… can you please provide exactly which code you placed where ? i will try do exactly same…
cpm
July 10, 2017, 7:34pm
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
dendy
July 11, 2017, 6:45am
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
Strange… anyway, thanks for help !!