我的问题是关于如何自定义 Zend 2 中的错误处理方式。
假设我想自定义布局,以便在控制器中的操作中执行此操作:
$layout = $this->layout();
$myNav = new ViewModel(array('nav' => $this->getNav());
$myNav->setTemplate('layout/nav');
$layout->addChild($myNav, 'navigation');
当我将它放入我的控制器以进行常规(即非 404)查看时效果很好。现在我已经定制了我的布局,这样我就可以做到<?php echo $this->navigation; ?>
了layout/nav.phtml
,而且一切都很好,一切都很好。
现在,假设我想在呈现错误时做同样的事情。我需要能够在错误处理程序将自己的代码返回ViewModel(...)
到error/404.phtml
模板之前以某种方式注入上述代码。
你是怎样做的?
我怀疑这类似于为服务管理器设置正确的类,如下所示module.config.php
:
'service_manager' => array(
'services' => array(
'error_handler' => 'MyModule\Controller\MyCustomErrorController'
//and so on...
我该怎么做呢?
更新:
在我的Module.php
我附上了一个方法MvcEvent::EVENT_DISPATCH_ERROR
。变体 A 有效,变体 B 无效。所以你不能在这里使用部分?我错过了一些非常基本的东西吗?
变体 A
public function onDispatchError(MvcEvent $event)
{
$sm = $event->getApplication()->getServiceManager();
$vm = $event->getViewModel();
$vm->setVariable('nav', '<h1>test do i work?</h1>');
//Works
}
变体 B
public function onDispatchError(MvcEvent $event)
{
$sm = $event->getApplication()->getServiceManager();
$vm = $event->getViewModel();
$nav = new ViewModel(array('test'=>'hello there'));
$nav->setTemplate('layout/simpletest');//contents: <?php echo $this->test; ?>
$vm->addChild($nav, 'nav');
//In the template, <?php echo $this->nav; ?> has nothing...
}