Symfony2在内核请求事件

时间:2015-06-03 10:21:21

标签: php symfony events

我可能会以完全错误的方式解决这个问题,但我有一个onKernelRequest事件设置,用于获取当前域(单个应用程序上的多个站点),查询缓存/数据库并将其存储在服务中以供其他人使用控制器/服务。这非常有效。

现在如果找不到域名,我想抛出404错误。通常我只是在控制器中执行以下操作:

throw new NotFoundHttpException('Not found!');

但是这导致了生产中未被捕获的异常,所以我假设由于事件的优先级(31)。

PHP Fatal error:  Uncaught exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' with message 'Not found!'

我当前的代码(为清楚起见删除了逻辑),请注意我使用JMSDiExtraBundle配置服务。

/**
 * @Service
 */
class CurrentDomainListener
{
    /**
     * @Observe("kernel.request", priority=31)
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        // find domain in cache/database...

        if (!$domain) {
            throw new NotFoundHttpException('Not found!');
        }

        // store domain in service...
    }
}

我的问题是,当域不存在时,显示404错误的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

不确定这是否是最优雅的解决方案,但我遇到了同样的问题,这对我有用:

当抛出异常并且ExceptionListener捕获它时,它会将异常添加到请求属性并重放请求。这会导致再次通知侦听器,并且它们将抛出另一个异常,原因与第一次相同。

我通过检查我的监听器中的请求中是否没有设置异常来解决(解决?)这个问题:

public function onKernelRequest(GetResponseEvent $event)
{
    $request = $event->getRequest();
    if ($request->attributes->has('exception')) {
        return;
    }

    // ...
    if ($somethingWasWrong) {
        throw new NotFoundHttpException();
    }
}

现在,在抛出异常时,不会检查失败的条件,并且将正确处理异常。

编辑:我查看了Symfony侦听器,并检查当前请求是否为主请求:

if (!$event->isMasterRequest()) {
    return;
}

答案 1 :(得分:0)

您可以返回404响应,而不是抛出异常:

public function onKernelRequest(GetResponseEvent $event)
{
    // find domain in cache/database...

    if (!$domain) {
        $event->setResponse(new Response('Not found!', 404));
    }

    // store domain in service...
}