gpt4 book ai didi

zend-framework2 - 手动触发 404 错误

转载 作者:行者123 更新时间:2023-12-04 07:16:13 26 4
gpt4 key购买 nike

我一直在努力手动触发 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::prepareNotFoundViewModelCALLED Zend\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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com