设置响应后,Symfony不会继续处理事件

时间:2014-01-24 14:19:19

标签: php symfony

目前我在symfony中有以下事件监听器。

namespace {app-namespace}\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

use {app-namespace}\Common;

class InvalidCredentialsExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        if ($event->getException() instanceof Common\InvalidCredentialsException) {
            $response = new Response();
            $response->setStatusCode('401');
            $event->setResponse($response);
        }
    }
}

我认为symfony会接收未经授权的状态代码,然后继续处理它,好像它是使用标准安全防火墙在堆栈中返回的更低。这可能吗。我宁愿不在这里修建网址。

2 个答案:

答案 0 :(得分:3)

Symfony 2的防火墙无法获取状态代码。 HTTP状态代码是Web服务器返回到webclient以提供有关请求发生的一些基本信息的内容。它不是内部应用程序所需要的东西。

我建议您查看FormAuthenticationEntryPoint中的start()方法,它将为您提供Symfony 2如何处理此转发/重定向操作的良好示例。

您可以在异常侦听器中模仿此操作。我建议你将http-utils(service-id security.http_utils)和路由器(服务id router)注入你的监听器。使用路由器获取登录页面的路径,并使用http-utils创建重定向响应。如果要转发而不是重定向,则需要http-kernel(service-id http_kernel),而不是http-utils。

答案 1 :(得分:0)

这是我几天前写的代码片段并成功使用了它:

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();

    $r = null;
    $req = $event->getRequest();

    if ($this->kernel->getEnvironment() == "dev") {
        return;
    }

    if ($exception instanceof RecoverableError) {
        $r = new Response($exception->getMessage(), $exception->getCode());
    }
    else if ($exception instanceof NotFoundHttpException) {
        // Symfony's HTTP404: Not found
    }
    else if ($exception instanceof AuthenticationException) {
        $r = new Response("You need to login in order to view this content.", 403);
    }
    else {
        // Http500: Server Error
        $r = new Response("Unknown error occurred.", 500);
    }


    if ($r !== null) {
        $event->setResponse($r);
    }
}

特别注意这一行:

$r = new Response("You need to login in order to view this content.", 403);