# How to override default PhpRenderer in ZF3 MVC

**URL:** <https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191>\
**Category:** Components & MVC\
**Tags:** zend-mvc, zend-view\
**Created:** [July 6, 2017, 3:02pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191 "2017-07-06T15:02:30Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![dendy](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/dendy/32/125_2.png) [@dendy](https://discourse.laminas.dev/u/dendy)\
**Post date:** [July 6, 2017, 3:02pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/1 "2017-07-06T15:02:30Z")

</div>

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 …

---

<div class="post-metadata">

**Author:** ![matthew](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/matthew/32/14_2.png) [@matthew](https://discourse.laminas.dev/u/matthew)\
**Post date:** [July 6, 2017, 4:26pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/2 "2017-07-06T16:26:17Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![dendy](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/dendy/32/125_2.png) [@dendy](https://discourse.laminas.dev/u/dendy)\
**Post date:** [July 7, 2017, 6:24am UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/3 "2017-07-07T06:24:21Z")

</div>

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,
        ],
    ]
```

---

<div class="post-metadata">

**Author:** ![matthew](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/matthew/32/14_2.png) [@matthew](https://discourse.laminas.dev/u/matthew)\
**Post date:** [July 10, 2017, 12:06pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/4 "2017-07-10T12:06:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![dendy](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/dendy/32/125_2.png) [@dendy](https://discourse.laminas.dev/u/dendy)\
**Post date:** [July 10, 2017, 12:42pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/5 "2017-07-10T12:42:31Z")

</div>

> [@matthew](#):
>
> Where are you registering your factory? This may be an issue of order of precedence…

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

---

<div class="post-metadata">

**Author:** ![cpm](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/cpm/32/107_2.png) [@cpm](https://discourse.laminas.dev/u/cpm)\
**Post date:** [July 10, 2017, 6:54pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/6 "2017-07-10T18:54:54Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![dendy](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/dendy/32/125_2.png) [@dendy](https://discourse.laminas.dev/u/dendy)\
**Post date:** [July 10, 2017, 7:07pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/7 "2017-07-10T19:07:30Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![cpm](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/cpm/32/107_2.png) [@cpm](https://discourse.laminas.dev/u/cpm)\
**Post date:** [July 10, 2017, 7:34pm UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/8 "2017-07-10T19:34:50Z")

</div>

All I did was adding:

```php
'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](https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php#L14)

---

<div class="post-metadata">

**Author:** ![dendy](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/dendy/32/125_2.png) [@dendy](https://discourse.laminas.dev/u/dendy)\
**Post date:** [July 11, 2017, 6:45am UTC](https://discourse.laminas.dev/t/how-to-override-default-phprenderer-in-zf3-mvc/191/9 "2017-07-11T06:45:12Z")

</div>

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 !!
