【问题标题】:Symfony2 Custom Error Exception Listener - Rendering templates or passing to a controllerSymfony2 自定义错误异常监听器 - 渲染模板或传递给控制器
【发布时间】:2012-11-06 17:30:23
【问题描述】:

我正在尝试找出在 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 不可用,这意味着我无法呈现我的自定义页面。

真的有两个问题,这是处理自定义错误页面的正确方法,还是应该将响应传递给控制器​​?如果是这样,最好的方法是什么?

如果这是正确的,我怎样才能使模板引擎在我的侦听器中可用?

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    你应该添加到你的监听器

    /**
     *
     * @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 }
    

    最好的方法是不要使用 service_container。 最好的方法是只注册必要的服务。

    这样

    /**
     *
     * @var Twig_Environment
     */
    private $twig;
    
    function __construct($twig) {
        $this->twig = $twig;
    }
    

    【讨论】:

    • 这正是我所需要的,谢谢。关键是设置构造函数,然后将“参数”传递给服务。我现在可以使用 $globalVars = $this->container->get('globalvars'); 访问依赖项
    • 你能告诉我,如何仅在生产环境时渲染自定义错误树枝吗?
    【解决方案2】:

    我解决类似问题的方法是:我不知道它是否可以帮助你。

    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);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2018-12-20
      相关资源
      最近更新 更多