如何通过捆绑包自定义异常?
例:
我有两个捆绑包:BackendBundle和FrontEndBundle。我希望在抛出error 404
时,这两个捆绑包由两个不同的模板处理。
我该怎么做?
我读过http://symfony.com/doc/current/cookbook/controller/error_pages.html但仍然没有找到线索。
答案 0 :(得分:1)
与上述cookbook article一样,扩展TwigBundle
和Symfony\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
。所以你必须考虑那个例子。