2016-04-07 9 views
4

私は2つのコントローラアクションを持っており、1つはレンダリング(コントローラ(...))機能によって、もう1つのツリーテンプレートでレンダリングされます。子のアクションの中で例外をスローすると、PRODuctionではなくDEVモードでしか捕捉されません。何らかのアイデアの理由とそれを回避する方法はありますか?PHP/Symfony - Twigでレンダリングされたコントローラからの例外がプロダクションモードでのみ捕捉されないのはなぜですか?

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

結果:

enter image description here

+0

(イベントリスナーを使用して)独自の例外ハンドラを使用しようとしましたか? – eRIZ

+0

'app.php'はデバッグモードを無効にしていますか? – tom10271

+0

これはおそらくデバッグモードのために起こります。つまり、このように例外を処理すべきではありません。もちろん、sfの中では、例外ハンドラを探す必要があります。 –

答えて

1

Symfony2プロジェクトでは、Twigは本番モードではデフォルトで例外をキャッチします。

あなたはすべての例外は、DEVモードでのようにスローされた順序でそれを設定することができます。

// 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)); 
    } 
} 
例外メッセージのトレース/メッセージについて

テンプレートの表示:あなたのリスナーのbegginingで次のように追加し、唯一の特定の例外をキャッチする

// 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 %} 

EDIT

// Listen only on the expected exception 
if (!$event->getException() instanceof RedirectException) { 
    return; 
} 

・ホープ、この助けてください。

+0

ただ1つの例外の型を聞くことは可能でしょうか?たとえば:RedirectException、私は値を取得し、リダイレクトを行うことができますか? – Mike

+0

私はあなたにあなたの答えを編集しました! – chalasr

+0

ありがとう!私は今それを試しています。私はサービス設定ファイルでエラーが発生しています。今すぐそれに取り組む。 – Mike

0

renderフィルタには、ignore_errorsというオプションを使用できます。生産にtrueあるので、それは、!$debugに設定しますデフォルトでは

{{ render(controller('WebBundle:Pages:child'), {'ignore_errors': false}) }} 

。あなたはそれを無効にすることができます。これにより、製造中でも例外はre-throwになります。

+0

これを試して、完全に動作します。しかし、おそらく私のコードに柔軟性を与えると思われる@chalasrの別の答えに行くつもりです。とにかくありがとう! – Mike

+0

本当に本番環境では 'debug:true'を設定しますか? – Federkun

+0

@Federico最も柔軟な代替案は、EventListenerです(私が私の答えで示します)。特定の例外のみを処理することができます。 – chalasr

関連する問題