zend-framework2 - 手动触发 404 错误

标签 zend-framework2

我一直在努力手动触发 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 CALLED 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/

相关文章:

php - Zend Framework 2 - DI 并且必须将表适配器注入(inject)表中......乏味吗?

zend-framework2 - 如何将某些内容记录到 Zend Developer Tools 工具栏?

php - Zend 框架 2 : Service locator in view helper

zend-framework2 - ZF2 获取 POST 和 GET 的值

ide - Sublime Text 2 和 ZF2 ... 自动完成不起作用

redirect - 如何重定向到 zend Framework 2 中的上一页?

PHP 代码嗅探器与 Zend Studio 失败

zend-framework2 - Zend/ZF2/TableGateway mysql_insert_id 替换?

layout - 具有小部件支持的全局侧边栏

php - Zend Framework 2 TableGateway MAX查询