2016-04-09 10 views
3

私はSilex 1.3に基づいてアプリを開発しています。これは私のSilexとの最初の出会いなので、私はあまりそれに精通していません。Silexでエラー/例外処理を無効にすることはできますか?

私は独自のエラー/例外ハンドラを使用したいと思います。これは、基本的には自身を登録し、すべてのエラー、致命的なエラー、キャッチされない例外をキャッチし、開発中のWhoops生産における優雅なハンドラ。

しかし、一度私はsilexコントローラ、ミドルウェアの中にいれば、何とかして、Silexが引き継ぎ、それ自身のエラー処理を使用します。 Silexはシャットダウンには至りませんが、他のすべてのものはSilexのデフォルトの「Something went wrong」ページに置き換えられているため、致命的なエラーが発生します。

$ app-> error()を使ってHOW Silexがエラーを処理することができますが、そこから元のErrorHandlerに戻す方法や、Silexのハンドルをオーバーライドする方法が見つかりませんでした。エラー。

私は、エラーハンドラを使用するようにSilexに指示する方法を知っていますか?$ app-> error()または他の方法を使用してください。b)Silexのエラー処理を完全に無効にするか、最後の手段は、Silexに致命的なエラーをキャッチさせて、$ app-> error()の中から3つのタイプすべてを扱うことができるのですか?

シレックスを初めて使用したので、より良い方法があれば、シレックスのエラー処理方法を教えてください。できれば質問にも答えてください。

いくつかのサンプルコード:

// This will register itself and then handle all errors. 
$handler = new ErrorHandler(); 

// These are all handled appropriately. 
nonexistentfunction();   // Correctly caught by ErrorHandler::handleFatalError 
trigger_error("example");   // Correctly caught by ErrorHandler::handlePhpError 
throw new \Exception("example"); // Correctly caught by ErrorHandler::handleException 

$app = new \Silex\Application(); 
$app->get('/', function() use ($app) { 

    // This is still handled correctly. 
    nonexistentfunction();   // Correctly caught by ErrorHandler::handleFatalError 

    // However, these are now overridden by Silex. 
    trigger_error("example");   // INCORRECTLY DISPLAYS SILEX ERROR PAGE. 
    throw new \Exception("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE. 

}); 
$app->run(); 

と参照のための非常に単純化されたのErrorHandler:私は知っている https://github.com/whoops-php/silex-1

答えて

2

:あなたはあなたのアプリケーション内の特定のプロバイダを登録する必要が

Class ErrorHandler 
{ 
    public function __construct() 
    { 
     $this->register(); 
    } 

    private function register() 
    { 
     register_shutdown_function(array($this, "handleFatalError")); 
     set_error_handler(array($this, "handlePhpError")); 
     set_exception_handler(array($this, "handleException")); 
    } 

    // Etc. 

} 
+0

$ app ['exception_handler'] - > disable();ありがとう!それがまさに私が必要としていたものです。おかしい、あなたは私にそれを与えたので、私はAPIで見つけることができます。私は彼らの文書化が少しうまくいったと思う= o) – Eli

-2

オプション(b)あなたは完全にSilexアプリのエラーハンドラを無効にすることができます。その後、あなたのcus tomエラーハンドラは、定義したとおりにうまく動作するはずです。

全く無効サイレックス・エラー・ハンドラ:

$app['exception_handler']->disable(); 

だから、それは次のようになります:一見Silex doc

を参照してください

require_once 'Exception.php'; # Load the class 
$handler = new ErrorHandler(); # Initialize/Register it 

$app = new \Silex\Application(); 
$app->get('/', function() use ($app) { 


    nonexistentfunction(); 
    trigger_error("example"); 
    throw new \Exception("example"); 

}); 
$app->run(); 
+0

真剣にデュード、。あなたはその質問を読んだことがありますか?そして、質問を読むことによって、私はただの質問のタイトルを読むことを意味しますか?ただのタイトル。 – Eli

1

、あなたにもexceptionHandlerのを登録する必要があります。シレックスは、致命的なエラーを処理するために例外に回します。また、私が正しく覚えていれば、コントローラーとミドルウェア(少なくともミドルウェアの前)に「スロー」されたときにこの種の例外が捕捉されますが、モデルの中には入れられません。

最後に、次のものを追加して処理することができます。

// register generic error handler (this will catch all exceptions) 
$app->error(function (\Exception $e, $exceptionCode) use ($app) { 
    //if ($app['debug']) { 
    // return; 
    //} 

    return \Service\SomeHelper::someExceptionResponse($app, $e); 
}); 

return $app; 

少し助けてくれることを願っています。

2

ExceptionHandler :: disable()がdeprecated in 1.3 and removed in 2.0であることに注意してください。そう:2.0前サイレックスで

$app['exception_handler']->disable(); 

サイレックス2.0+では:

unset($app['exception_handler']); 
関連する問題