我一直在努力手动触发 dispatch.error
来自另一个 Controller 监听器。
目标是在路由参数无效的情况下引发 404 错误并使其被标准 Zend\Mvc\View\Http\RouteNotFoundStrategy
“捕获”。所以404页面被渲染。
public function FooController extends AbstractActionController
{
protected $foo;
public function getEventManager()
{
$em = parent::getEventManager();
// Attach with higher priority than dispatched indexAction
$em->attach('dispatch', array($this, 'getFooFromRouteParam'), 10);
}
public function indexAction()
{
$foo = $this->getFoo(); // Error 500 (not 400)
}
public function getFooFromRouteParam(EventInterface $event)
{
$id = $this->params('id', false);
if (! empty($id)) {
$foo = $this->aDatabaseService->loadFromTheDatabase($id);
if ($foo instanceof Foo) {
$this->setFoo($foo);
return;
}
}
$response = $event->getResponse();
$response->setStatusCode(404);
$event->setError(\Zend\Mvc\Application::ERROR_ROUTER_NO_MATCH);
$event->getApplication()
->getEventManager()
->trigger('dispatch.error', $event);
//return $response;
}
public function getObjectFoo()
{
if (null == $this->foo) {
throw new \RuntimeException('foo not set');
}
return $this->foo;
}
public fucntion setObjectFoo(Foo $object)
{
$this->foo = $object;
}
}
事件被正确触发,调试它们给了我:CALLED
Zend\Mvc\View\Http\RouteNotFoundStrategy::detectNotFoundError
(The error is :error-controller-not-found
)CALLED
Zend\Mvc\View\Http\RouteNotFoundStrategy::prepareNotFoundViewModel
CALLEDZend\Mvc\View\Http\RouteNotFoundStrategy::injectNotFoundReason
但是,在给我一个
404
之后返回响应没有 body 。return $response; // ends execution with 404 but no body, just white screen.
如果我不返回响应,调度会继续,我会收到 500
错误RuntimeException 'foo not set'
如何手动触发 404 错误并正确呈现 404 模板?
最佳答案
我认为你不能,也不应该。当你在 Controller 中时,路由器已经完成了它的工作,所以回到 Zend\Mvc\View\Http\RouteNotFoundStrategy
不管用。
你应该做的就是把路由中需要的参数设置好,路由器会帮你做检查。
如果您已经考虑过这一点,但仍想对请求处理错误使用 404 响应,请查看实际的 DispatchListener 如何处理它:
$event->setError($application::ERROR_EXCEPTION)
->setController($controllerName)
->setParam('exception', $exception);
$events = $application->getEventManager();
$results = $events->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
$return = $results->last();
if (! $return) {
$return = $event->getResult();
}
关于zend-framework2 - 手动触发 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25564142/