私の質問は、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...
}