Php 如何在ZF2应用程序中显示客户错误页面和设置响应代码?

Php 如何在ZF2应用程序中显示客户错误页面和设置响应代码?,php,doctrine-orm,exception-handling,zend-framework2,Php,Doctrine Orm,Exception Handling,Zend Framework2,在我的Module.php中,我附加了一个处理程序来捕获异常。这是可行的,但我不确定如何设置响应和视图模板 下面的代码尝试将响应代码设置为409并显示409.phtml模板。但是它不工作,它只是呈现原始的500错误页面 public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListene

在我的Module.php中,我附加了一个处理程序来捕获异常。这是可行的,但我不确定如何设置响应和视图模板

下面的代码尝试将响应代码设置为409并显示409.phtml模板。但是它不工作,它只是呈现原始的500错误页面

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);

    $eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'handleError'));
}

public function handleError(MvcEvent $event)
{
    //get the exception
    $exception = $event->getParam('exception');
    if (is_a($exception, 'Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException'))
    {
        $response = $event->getResponse();
        $response = $response ?: new Response();
        $model    = new ViewModel(array());
        $model->setTemplate('error\409');
        $event->getViewModel()->addChild($model);
        $response->setStatusCode(409);
        $event->setResponse($response);
        return $response;
    }
}

这似乎有效,但了解其他人的想法会很有趣

public function handleError(MvcEvent $event)
{
    //get the exception
    $exception = $event->getParam('exception');
    if (is_a($exception, 'Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException'))
    {
        $event->getResponse()->setStatusCode(409);
        $model    = new ViewModel(array());
        $model->setTemplate('error/409');
        $event->getViewModel()->clearChildren();
        $event->getViewModel()->addChild($model);
        $event->stopPropagation(true);
    }
}

尝试更高的优先级。默认的异常策略
Zend\Mvc\View\Http\ExceptionStrategy
为。这将导致在您之前执行it。另外,请注意,该类使用
$event->setResult($model)而不是
$event->getViewModel()->addChild($model)
。处理程序捕捉到异常ok,响应代码正确设置为409。只是它接着显示了500错误页面。我似乎已经用StopRobOrganization()解决了这个问题。当我有机会的时候,我会试着看看setResult($model)。谢谢你的评论。