简体   繁体   English

Zend 2:如何使用自定义控制器配置错误?

[英]Zend 2: How to configure errors with custom controller?

My question is regarding customizing how errors are handled in Zend 2. 我的问题是关于自定义Zend 2中如何处理错误。

Suppose I'd like to customize the layout such that I want to do this in an action in my controller: 假设我想自定义布局,以便在控制器中的一个操作中做到这一点:

$layout = $this->layout();
$myNav = new ViewModel(array('nav' => $this->getNav());
$myNav->setTemplate('layout/nav');
$layout->addChild($myNav, 'navigation');

Works great when I place this into my controller for regular (ie non-404) viewing. 当我将其放入控制器进行常规(即非404)查看时,效果很好。 Now I've customized my layout so that I can do <?php echo $this->navigation; ?> 现在,我已经自定义布局,以便可以执行<?php echo $this->navigation; ?> <?php echo $this->navigation; ?> and the layout/nav.phtml is fired up and everything works just hunky dory. <?php echo $this->navigation; ?>然后启动layout/nav.phtml ,一切都正常进行。

Now, suppose I want to do the exact same thing when errors are rendered. 现在,假设出现错误时我想做完全相同的事情。 I need to be able to inject the above code somehow prior to the error handler returning it's own ViewModel(...) into the error/404.phtml template. 我需要能够在错误处理程序将其自身的ViewModel(...)error/404.phtml模板之前以某种方式注入上述代码。

How do you do that? 你是怎样做的?

I suspect that it's something like setting up the correct class for the service manager like this in module.config.php : 我怀疑这就像在module.config.php为服务管理器设置正确的类:

'service_manager' => array(
    'services' => array(
        'error_handler' => 'MyModule\Controller\MyCustomErrorController'
        //and so on...

How do I do this? 我该怎么做呢?

UPDATE: 更新:

In my Module.php I've attached a method for MvcEvent::EVENT_DISPATCH_ERROR . 在我的Module.php我附加了MvcEvent::EVENT_DISPATCH_ERROR的方法。 Variant A works, Variant B does not. 变体A有效,而变体B不起作用。 So you can't use partials here?? 因此,您不能在此处使用局部变量? Am I missing something really basic?? 我错过了一些基本的东西吗?

Variant A 变体A

public function onDispatchError(MvcEvent $event)
{
    $sm  = $event->getApplication()->getServiceManager();
    $vm = $event->getViewModel();
    $vm->setVariable('nav', '<h1>test do i work?</h1>');
    //Works
}

Variant B 变体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...
}

Zf2 use module.config.php file to set error handling: Zf2使用module.config.php文件设置错误处理:

'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),

This should handle 4xx client errors and 5xx server errors. 这应该处理4xx客户端错误和5xx服务器错误。

For custom error page in specific module. 对于特定模块中的自定义错误页面。

namespace ModuleName;

use Zend\ModuleManager\Feature\BootstrapListenerInterface;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;

class Module implements
    BootstrapListenerInterface,
    AutoloaderProviderInterface,
    ConfigProviderInterface
{
    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $eventManager->attach('dispatch', array($this, 'loadConfiguration' ), 100);
    }

    public function loadConfiguration(MvcEvent $e)
    {
    $sm  = $e->getApplication()->getServiceManager();

        $controller = $e->getRouteMatch()->getParam('controller');
        if (0 !== strpos($controller, __NAMESPACE__, 0)) {
            //if not this module
            return;
        }

        //if this module
    $exceptionstrategy = $sm->get('ViewManager')->getExceptionStrategy();
    $exceptionstrategy->setExceptionTemplate('error/errorcustom');
    }

    public function getAutoloaderConfig(){ /* common code */ }
    public function getConfig(){ /* common code */}
}

The solution is provided by "samsonasik" from http://samsonasik.wordpress.com/2012/09/19/zend-framework-2-create-custom-error-page/ 该解决方案由http://samsonasik.wordpress.com/2012/09/19/zend-framework-2-create-custom-error-page/中的 “ samsonasik”提供

You can attach to an even to handle what happend when a 404 is triggered: 您可以附加一个偶数来处理触发404时发生的情况:

Module.php 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..
         }
    );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM