通过Bundle自定义异常模板

时间:2014-01-24 07:29:21

标签: php symfony

如何通过捆绑包自定义异常?

例:
我有两个捆绑包:BackendBundle和FrontEndBundle。我希望在抛出error 404时,这两个捆绑包由两个不同的模板处理。

我该怎么做?

我读过http://symfony.com/doc/current/cookbook/controller/error_pages.html但仍然没有找到线索。

2 个答案:

答案 0 :(得分:1)

与上述cookbook article一样,扩展TwigBundleSymfony\Bundle\TwigBundle\Controller\ExceptionController:findTemplate。在那里你可以决定(如果它不在调试中)显示404。

此示例假定您在/backend下可以访问所有后端路由。根据您的需要更改它,或者使用请求中的其他内容来确定您的后端404。

namespace Acme\ErrorBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseController;

/**
 * ExceptionController.
 */
class ExceptionController extends BaseController
{
    /**
     * @param Request $request
     * @param string  $format
     * @param integer $code       An HTTP response status code
     * @param Boolean $debug
     *
     * @return TemplateReference
     */
    protected function findTemplate(Request $request, $format, $code, $debug)
    {
        // find template for backend 404 errors
        if (!$this->debug && 404 == $code && false !== strpos($request->getPathInfo(), '/backend')) {
            $template = new TemplateReference('TwigBundle', 'Exception', 'backend404', $format, 'twig');
            if ($this->templateExists($template)) {
                return $template;
            }
        }

        // the parent method finds the error404.html.twig for the frontend
        return parent::findTemplate($request, $format, $code, $debug);
    }
}

另外,ErrorBundle必须从TwigBundle继承。

答案 1 :(得分:0)

您可以挂钩KernelEvents::EXCEPTION事件并覆盖将发送到浏览器的响应。我为你写了一个快速的要点:

https://gist.github.com/bezhermoso/87716a9c72a1d12c5036

但是,$event->getRequest()->get('_controller')显然会在404错误上返回null。所以你必须考虑那个例子。