Php Symfony-won';设置响应后,无法继续处理事件
目前我在symfony中有以下事件侦听器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
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
)和路由器(服务idrouter
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果要转发而不是重定向,则需要http内核(服务idhttp_内核
),而不是http UTIL。Symfony 2的防火墙不会接收状态代码。HTTP状态代码是Web服务器返回到webclient以提供有关请求发生情况的基本信息的代码。它不是应用程序内部需要的东西
我建议您看看中的start()
方法,它将为您提供一个很好的示例,说明Symfony 2如何处理此转发/重定向操作
您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务idrouter
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果要转发而不是重定向,则需要http内核(服务idhttp_内核
),而不是http UTIL。Symfony 2的防火墙不会接收状态代码。HTTP状态代码是Web服务器返回到webclient以提供有关请求发生情况的基本信息的代码。它不是应用程序内部需要的东西
我建议您看看中的start()
方法,它将为您提供一个很好的示例,说明Symfony 2如何处理此转发/重定向操作
您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务idrouter
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果要转发而不是重定向,则需要http内核(服务idhttp_内核
),而不是http UTIL。Symfony 2的防火墙不会接收状态代码。HTTP状态代码是Web服务器返回到webclient以提供有关请求发生情况的基本信息的代码。它不是应用程序内部需要的东西
我建议您看看中的start()
方法,它将为您提供一个很好的示例,说明Symfony 2如何处理此转发/重定向操作
您可以在异常侦听器中模拟这一点。我建议您将http UTIL(服务id
security.http_-UTIL
)和路由器(服务idrouter
)注入到侦听器中。使用路由器获取登录页面的路径,并使用http UTIL创建重定向响应。如果你想转发而不是重定向,你将需要http内核(服务idhttp_kernel
),而不是http UTIL。如果你已经准备好了响应,symfony为什么要继续处理?是的,这是一个公平的点,但如果响应是401,我希望触发防火墙来处理这个问题。响应为“就绪”,但symfony在实际发布标题之前会在很多地方了解到这一点。如果要添加自定义标题,必须先了解onKerelException变体的优先级。我认为有一种方法可以做到这一点,但我现在无法为你找到。在这种情况下没有区别。如果我太多地丢弃prio,它将无法捕获异常。再高一点,结果还是一样。我想你错过了状态码。这是您想要的HTTP403
禁止,对吗?如果您已经准备好响应,为什么symfony要继续处理?是的,这是一个公平点,但如果响应是401,我希望这会触发防火墙来处理此问题。响应为“就绪”,但symfony在实际发布标题之前会在很多地方了解到这一点。如果要添加自定义标题,必须先了解onKerelException变体的优先级。我认为有一种方法可以做到这一点,但我现在无法为你找到。在这种情况下没有区别。如果我太多地丢弃prio,它将无法捕获异常。再高一点,结果还是一样。我想你错过了状态码。这是您想要的HTTP403
禁止,对吗?如果您已经准备好响应,为什么symfony要继续处理?是的,这是一个公平点,但如果响应是401,我希望这会触发防火墙来处理此问题。回应是“准备好了”,但赛姆弗尼在头球出现之前有很多地方会注意到这一点