PHP / Symfony – 为什么使用Twig呈现的控制器的异常仅未在生产模式中捕获?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP / Symfony – 为什么使用Twig呈现的控制器的异常仅未在生产模式中捕获?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2124字,纯文字阅读大概需要4分钟。
内容图文
![PHP / Symfony – 为什么使用Twig呈现的控制器的异常仅未在生产模式中捕获?](/upload/InfoBanner/zyjiaocheng/788/b7aace7f433f4e77bc188c204505a10f.jpg)
我有2个控制器动作,一个通过渲染(控制器(…))函数在另一个的树枝模板中渲染.如果我在子动作中抛出一个异常,它只会在DEV模式下捕获,而不是在PRODuction中,任何想法为什么以及如何绕过它?
DefaultController.php
/**
* @Route("/test/child", name="test_child")
*/
public function childAction(Request $request)
{
throw new \Exception($request->getRequestUri());
return $this->render("child.html.twig");
}
/**
* @Route("/test/parent", name="test_parent")
*/
public function parentAction(Request $request)
{
try {
return $this->render("parent.html.twig");
} catch(\Exception $e)
{
die("got it!");
}
}
child.html.twig
Child
parent.html.twig
Parent
<br>
{{ render(controller("WebBundle:Pages:child")) }}
结果:
解决方法:
在Symfony2项目中,Twig在生产模式下默认捕获异常.
您可以对其进行配置,以便在开发模式下抛出所有异常:
// app/config/config.yml
twig:
# ...
debug: true # default: %kernel.debug%
或者,配置异常监听器:
服务声明:
// app/config/services.yml
app.exception_listener:
class: Acme\CoreBundle\Listener\ExceptionListener
arguments: [ "@templating" ]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
类:
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\Templating\EngineInterface;
class ExceptionListener
{
private $templateEngine;
public function __construct(EngineInterface $templateEngine)
{
$this->templateEngine = $templateEngine;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
$response = $this->templateEngine->render(
'TwigBundle:Exception:error500.html.twig',
array('status_text' => $event->getException()->getMessage())
);
$event->setResponse(new Response($response));
}
}
用于异常消息跟踪/消息显示的模板:
// app/Resources/TwigBundle/views/Exception/error500.html.twig
{% extends '::base.html.twig' %}
{% block body %}
<div class='error'>
<div class="message">
<h2>Application Error</h2>
<p>Oops! {{ status_text }}</p>
</div>
</div>
{% endblock %}
编辑
要仅捕获特定异常,请在侦听器的开头添加以下内容:
// Listen only on the expected exception
if (!$event->getException() instanceof RedirectException) {
return;
}
希望这可以帮助.
内容总结
以上是互联网集市为您收集整理的PHP / Symfony – 为什么使用Twig呈现的控制器的异常仅未在生产模式中捕获?全部内容,希望文章能够帮你解决PHP / Symfony – 为什么使用Twig呈现的控制器的异常仅未在生产模式中捕获?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。