Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony-won';设置响应后,无法继续处理事件_Php_Symfony - Fatal编程技术网

Php Symfony-won';设置响应后,无法继续处理事件

Php Symfony-won';设置响应后,无法继续处理事件,php,symfony,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

目前我在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会获取当时未经授权的状态代码,然后继续处理它,就像使用标准安全防火墙返回堆栈中较低的代码一样。这可能吗。我不想在这里构建URL。

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

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);

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

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);

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

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);

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

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);

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

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


您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务id
router
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果要转发而不是重定向,则需要http内核(服务id
http_内核
),而不是http UTIL。

Symfony 2的防火墙不会接收状态代码。HTTP状态代码是Web服务器返回到webclient以提供有关请求发生情况的基本信息的代码。它不是应用程序内部需要的东西

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


您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务id
router
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果要转发而不是重定向,则需要http内核(服务id
http_内核
),而不是http UTIL。

Symfony 2的防火墙不会接收状态代码。HTTP状态代码是Web服务器返回到webclient以提供有关请求发生情况的基本信息的代码。它不是应用程序内部需要的东西

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


您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务id
router
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果要转发而不是重定向,则需要http内核(服务id
http_内核
),而不是http UTIL。

Symfony 2的防火墙不会接收状态代码。HTTP状态代码是Web服务器返回到webclient以提供有关请求发生情况的基本信息的代码。它不是应用程序内部需要的东西

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



您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务id
router
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果你想转发而不是重定向,你将需要http内核(服务id
http_kernel
),而不是http UTIL。

如果你已经准备好了响应,symfony为什么要继续处理?是的,这是一个公平的点,但如果响应是401,我希望触发防火墙来处理这个问题。响应为“就绪”,但symfony在实际发布标题之前会在很多地方了解到这一点。如果要添加自定义标题,必须先了解onKerelException变体的优先级。我认为有一种方法可以做到这一点,但我现在无法为你找到。在这种情况下没有区别。如果我太多地丢弃prio,它将无法捕获异常。再高一点,结果还是一样。我想你错过了状态码。这是您想要的
HTTP403
禁止,对吗?如果您已经准备好响应,为什么symfony要继续处理?是的,这是一个公平点,但如果响应是401,我希望这会触发防火墙来处理此问题。响应为“就绪”,但symfony在实际发布标题之前会在很多地方了解到这一点。如果要添加自定义标题,必须先了解onKerelException变体的优先级。我认为有一种方法可以做到这一点,但我现在无法为你找到。在这种情况下没有区别。如果我太多地丢弃prio,它将无法捕获异常。再高一点,结果还是一样。我想你错过了状态码。这是您想要的
HTTP403
禁止,对吗?如果您已经准备好响应,为什么symfony要继续处理?是的,这是一个公平点,但如果响应是401,我希望这会触发防火墙来处理此问题。回应是“准备好了”,但赛姆弗尼在头球出现之前有很多地方会注意到这一点