Прослушиватель исключений пользовательских ошибок Symfony2 - рендеринг шаблонов или передача в контроллер
Я пытаюсь найти лучший способ обработки пользовательских страниц ошибок в Symfony2.Это включает в себя 500 и 404 'с и т. д.
Я могу создавать свои собственные пользовательские шаблоны (error404.html.twig и т. Д.) И выводить их нормально, проблема в том, что приложение требует, чтобы в базовый шаблон было передано несколько переменных, чтобы страница оставалась согласованной. Использование встроенного обработчика исключений приводит к недоступности требуемых переменных.
Я успешно настроил пользовательский прослушиватель событий исключения и зарегистрировал его в качестве службы:
namespace MyCo\MyBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\TwigBundle\TwigEngine;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
class MyErrorExceptionListener
{
public function onKernelException(GetResponseForExceptionEvent $event)
{
// We get the exception object from the received event
$exception = $event->getException();
if($exception->getStatusCode() == 404)
{
//$engine = $this->container->get('templating');
//$content = $engine->render('MyBundle:Default:error404.html.twig');
//return $response = new Response($content);
/* Also Tried */
//$templating = $this->container->get('templating');
//return $this->render('MyBundle:Default:index.html.twig');
$response = new Response($templating->render('MyBundle:Exception:error404.html.twig', array(
'exception' => $exception
)));
$event->setResponse($response);
}
}
}
Это нене работает, так как: $ container недоступен, то есть я не могу отобразить свою пользовательскую страницу.
Итак, два вопроса на самом деле, это правильный способ обработки пользовательских страниц ошибок или я должен передать ответ контроллеру? Если так, каков наилучший способ сделать это?
Если это правильно, как я могу сделать шаблонизатор доступным в моем Слушателе?