Symfony2: обработка исключения 404

19 Aug 2015

Допустим, что нам нужно обработать исключение 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);