1

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

2 に答える 2

0

イベントにアタッチして、404 がトリガーされたときに何が起こったかを処理できます。

Module.php

public function onBootstrap(MvcEvent $e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    /**
     * Log any Uncaught Errors
     */
    $sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
    $sm = $e->getApplication()->getServiceManager();
    $sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
         function($e) use ($sm) {
            /**
             * Decide what to do now we've got a problem...
             * Log the issue etc..
             * You could forward to some custom controller if you wanted..
             */
            //$sm->get('Zend\Log\Logger')->crit('an error occurred... bla');
            $controller = $e->getTarget();
            //$routeMatch = $e->getRouteMatch();
            $controller->layout('somelayout'); // possibly change the layout..
         }
    );
}
于 2013-06-18T08:44:07.957 に答える