2016-03-23 14 views
3

私はSymfony\Component\Debug\Debugを勉強しています。 私が知っている限り、AppKernelのコンストラクタは、デバッグモダリティを使用するかどうかを定義するための第2引数を受け入れることができます(true/false)。 私が実際に理解していないのは、公式のSymfony Githubのrepositoryのapp_dev.phpに示されているように、使用方法と相補性はDebug::enable()です。Symfony 3コントローラのエラートレースをブロックできません

たとえば、コントローラにExceptionを投げかけてみましたが、私はDebug::enable();のapp_dev.phpにコメントしましたが、私は常にerror pageが表示されます。

Debug::enable();のコメントにもかかわらず、エラートレースが表示されるのはなぜですか。

答えて

2

Debug::enable()方法は、アプリケーションがエラーを処理するために失敗した場合に呼び出されるフォールバックエラーハンドラを登録

短い説明。

$debugフラグがtrueに設定されているカーネルが起動したときに表示されるエラーページは、アプリケーションエラー処理(例外リスナーによって実装されています)の結果です。スタックトレースを無効にするには、フラグをfalseに設定します。あなたがテストの後でさえあれば、disable error pages in developmentでもかまいません。

Debugコンポーネントで表示されるページは、例外リスナーによって提供されるページほど素晴らしいものではありませんが、PHPよりも優れています。

詳細説明

フロントコントローラは、アプリケーションのカーネルを呼び出します。

$kernel = new AppKernel('dev', true); 
$response = $kernel->handle(Request::createFromGlobals()); 

アプリケーションのカーネルが起動自体、コンテナを作成し、要求を処理するためのHTTPカーネルを呼び出します。

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) 
{ 
    if (false === $this->booted) { 
     $this->boot(); 
    } 

    return $this->getHttpKernel()->handle($request, $type, $catch); 
} 

httpカーネルはイベントディスパッチャを使用して特定のイベントをトリガします(kernel.requestkernel.responsekernel.exceptionなど)。リクエストの処理中に例外がスローされた場合は、httpカーネルはそれをキャッチし、kernel.exceptionイベントをトリガします:Symfonyのスタンダード版ではデフォルトで登録されたリスナーの

// the following code is simplified to show the point 

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) 
{ 
    try { 
     return $this->handleRaw($request, $type); 
    } catch (\Exception $e) { 
     return $this->handleException($e, $request, $type); 
    } 
} 

private function handleException(\Exception $e, $request, $type) 
{ 
    $event = new GetResponseForExceptionEvent($this, $request, $type, $e); 
    $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event); 

    // ... 
} 

一つはSymfony\Component\HttpKernel\EventListener\ExceptionListenerです。これは素晴らしいエラーページの描画を担当します。

しかし、httpカーネルで要求を処理するときに例外が発生するだけです。したがって、この呼び出しの外で何かがうまくいかなければ、それは処理されません(前のコード例のキャッチブログを見てください)。

ここにDebugコンポーネントがあります。Debug::enable()メソッドは、エラーハンドラ、例外ハンドラ、および特殊なクラスローダーを登録します。 httpカーネルなしで、どのPHPプロジェクトでも使用できます。これは、アプリケーションがエラーを処理できなかった場合に呼び出されるフォールバックエラーハンドラの一種です。カーネルの$debugコンストラクタ引数とは関係ありません。

関連する問題