[英]Zend 2: How to configure errors with custom controller?
我的问题是关于自定义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; ?>
<?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...
}
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',
),
这应该处理4xx客户端错误和5xx服务器错误。
对于特定模块中的自定义错误页面。
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 */}
}
该解决方案由http://samsonasik.wordpress.com/2012/09/19/zend-framework-2-create-custom-error-page/中的 “ samsonasik”提供
您可以附加一个偶数来处理触发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..
}
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.