Symfony2: обработка исключения 404
Допустим, что нам нужно обработать исключение 404 и вместо стандартного ответа сервера (или шаблона ошибки ответить специфической страницей.
Как кастомизировать страницы подробно описано в официальной документации.
Нас будет интересовать пункт работы с эвентом kernel.exception.
Можно посмотреть один из примеров его использования.
Наш кейс: если symfony не смог обработать роут, то управление передается своему обработчику.
namespace AppBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class ExceptionListener
{
protected $templating;
protected $kernel;
public function __construct(EngineInterface $templating, $kernel)
{
$this->templating = $templating;
$this->kernel = $kernel;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
if ($event->getException() instanceof NotFoundHttpException) {
$response = new Response();
$response->setContent("Какие-то данные");
//$response->setStatusCode(200) работать не будет
$response->headers->set('X-Status-Code', 200);
$event->setResponse($response);
}
}
}
В config.yml прописывем что-то вроде
services:
kernel.listener.app_exception_listener:
class: AppBundle\Listener\ExceptionListener
arguments: [@templating, @kernel]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
И обратите внимание, что переопределение статуса ответа в виде
$response->setStatusCode(200)
работать не будет. Мы не сможем переопределить статус отвта на 2хх с помощью этого метода (на любой другой можно).
Для того, чтобы мы могли переопределить ответ 404 нужно использовать метод
$response->headers->set('X-Status-Code', 200);
Категории: HowTo