Symfony2自定义错误异常侦听器-呈现模板或传递到控制器
我正在努力找出处理Symfony2中自定义错误页面的最佳方法。这包括500和404等 我可以创建自己的自定义模板(error404.html.twig等)并将其呈现出来,问题是,应用程序需要将一些变量传递到基本模板中,以保持页面的一致性。使用内置异常处理程序会导致所需变量不可用 我已成功设置自定义异常事件侦听器,并将其注册为服务:Symfony2自定义错误异常侦听器-呈现模板或传递到控制器,symfony,twig,Symfony,Twig,我正在努力找出处理Symfony2中自定义错误页面的最佳方法。这包括500和404等 我可以创建自己的自定义模板(error404.html.twig等)并将其呈现出来,问题是,应用程序需要将一些变量传递到基本模板中,以保持页面的一致性。使用内置异常处理程序会导致所需变量不可用 我已成功设置自定义异常事件侦听器,并将其注册为服务: namespace MyCo\MyBundle\Listener; use Symfony\Component\HttpKernel\Event\GetRespon
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不可用,这意味着我无法呈现自定义页面
所以有两个问题,这是处理自定义错误页面的正确方法,还是应该将响应传递给控制器?如果是这样,最好的方法是什么
如果这是正确的,我如何使模板引擎在我的侦听器中可用?您应该将其添加到您的侦听器中
/**
*
* @var ContainerInterface
*/
private $container;
function __construct($container) {
$this->container = $container;
}
你如何注册你的听众?
您应该注册类似侦听器的服务
那样
core.exceptlistener:
class: %core.exceptlistener.class%
arguments: [@service_container]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 200 }
/**
*
* @var Twig_Environment
*/
private $twig;
function __construct($twig) {
$this->twig = $twig;
}
最好的方法是不要使用服务容器。
最好的方法是只注册必要的服务
那样
core.exceptlistener:
class: %core.exceptlistener.class%
arguments: [@service_container]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 200 }
/**
*
* @var Twig_Environment
*/
private $twig;
function __construct($twig) {
$this->twig = $twig;
}
我解决类似问题的方法是:我不知道它是否能帮到你
const GENERIC_CODE = 550;
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
if ($exception instanceof RedirectableException) {
$request = $event->getRequest();
$url = $exception->getUrl($this->_authentication['base']['url']);
$response = new Response();
$response->setStatusCode(self::GENERIC_CODE, AuthenticationException::GENERIC_MESSAGE);
$response->setContent($url);
$event->setResponse($response);
}
}
这就是我需要的,谢谢。关键是设置构造函数,然后将“参数”传递到服务中。我现在可以使用$globalVars=$this->container->get('globalVars')访问依赖项;你们能告诉我,只有当环境是生产环境时,如何渲染自定义错误细枝吗?