2012-05-08 10 views
1

私はコハナのエラーハンドラを作成しています。 アクションがコハナに存在するかどうかを確認します

が含ま

Route::set('errors','errors/<action>', array (
     'action' => '[\d]{3}', 
    )) 
    ->defaults(array(
     'controller' => 'errors', 
    )); 
サンプルbootstrap.phpの

try { 
    $response = Request::factory()->execute(); 
} catch (Exception $e) { 
    // If we are in development and the error wasn't a 404, show the stack trace. 
    // Otherwise, show a nice error. 
    if ((Kohana::$environment == KOHANA::DEVELOPMENT) AND (! ($e->getCode() == 404 OR $e->getCode() == 403))) { 
     throw $e; 
    } 
    // Log the error 
    Kohana::$log->add(Log::ERROR, Kohana_Exception::text($e)); 

    $error_code = 500; 
    if ($e instanceof ReflectionException) { 
     $error_code = 404; 
    } 
    if ($e instanceof HTTP_Exception) 
    { 
     $error_code = $e->getCode(); 
    } 
    $request = Request::factory('errors/'.$error_code); 
    if (*__NOT SURE WHAT GOES HERE__*) { 
     $request = Request::factory('errors/500'); 
    } 
    $response = $request->execute(); 
} 

// Send the headers and echo the response 
echo $response->send_headers()->body(); 

action_404様作用、action_403action_500とコントローラController_ErrorsController_Kohana_Errorsを継承)、等

ルートがあります私は人々が私のクラスを拡張することを許可したいので、私は何かの方法が必要ですアクションが存在する場合はck、存在しない場合は500エラーを表示するように変更します。 (*__NOT SURE WHAT GOES HERE__*を言う行を参照してください。)

答えて

1

は、私は次のコードがそれを行うだろうと思います。

if ($request->status == 404 && $error_code != 404) ... 

をこのケースでは、404が元の要求から来るので、必要なかったことを知っていますエラーコードのエラーページをロードするattmptから来ました。

+0

これは、要求を実行する別のtry/catch内にあることが必要です。それは最も効率的な方法のようには見えません。 – yakatz

+0

なぜ別のtry/catchの中にいなければならないのでしょうか?このうちどれが別の例外をスローしていますか? –

+0

'$ request = Request :: factory( 'errors /' .$ error_code);'はステータスを設定しません。最初に 'execute()'を呼び出す必要があり、例外がスローされます。 – yakatz

関連する問題