エラー処理
序
全ての人々が知っている (べきだ) と思いますが、エラー処理 は、開発過程において非常に重要な部分をなしています。リクエストしたページがアクセス不能であることをユーザ (彼・彼女・あるいはそれ) に示すだけではなく、 HTTP エラーステータスを返すことで (ブラウザやそれに類する) マシンに対して、 今何が起きているのかを知らせる方法でもあります。
404 エラー
404 のルートは app/config/routes.php で設定されます。そのルートは 404 のページ処理を行う controller/method を指示しています。 この点について、更にルーティングの節を参照ください。
404 をスローする
ルーティング処理時のように、404 エラーをスローしたい時があるでしょう。 これは、HttpNotFoundException をスローすることで簡単に出来ます。404ページが動作すると、 Fuel は 終了 します。
throw new HttpNotFoundException;
この例外は、アプリケーションの index.php ファイル内で捕捉、処理されます。例外が捕捉されると、 設定されている 404 ルートを探し、見つかった場合、リクエストされた URI に対応する新しいリクエスト生成します。 つまりは、あたかも通常のリクエストと同じようにして、 その URI は 他のリクエストと同様のルーティング がなされるのです!
このような動作を望まないなら、index.php ファイルを下記のように変更してください。
// Generate the request, execute it and send the output.
try
{
$response = Request::forge()->execute()->response();
}
catch (HttpNotFoundException $e)
{
$route = array_key_exists('_404_', Router::$routes) ? Router::$routes['_404_']->translation : Config::get('routes._404_');
if ($route)
{
// forge リクエストに 'false' を設定することで、ルーティングエンジンを無効にする
$response = Request::forge($route, false)->execute()->response();
}
else
{
throw $e;
}
}
404 処理
リクエストが生成され、そのルータがマッチしえるものを探し、その結果マッチするものがなかった場合、404 処理が開始されます。 デフォルトでは _404_ ルートは welcome/404 に向けられています。 以下、そのメソッドを一瞥することにしましょう:
// Inside Controller_Welcome
/**
* The 404 action for the application.
*
* @access public
* @return void
*/
public function action_404()
{
$messages = array('Aw, crap!', 'Bloody Hell!', 'Uh Oh!', 'Nope, not here.', 'Huh?');
$data['title'] = $messages[array_rand($messages)];
// Set a HTTP 404 output header
return Response(View::forge('welcome/404', $data), 404);
}
上記引用した部分を見れば、404 処理がどのようになっているのかわかると思います。普通のコントローラのアクションと同じです。 この処理が適切な点は、好みの内容をページ表示することが出来るところにあります。 データベースから取得したデータをそのビューに読み込むことが出来るのです。
Fuel は 404 ステータスを設定していませんので、ご自分で HTTP レスポンスを設定する必要があることに留意ください。正しいステータスヘッダを送信するには、 Response::forge(ViewModel::forge('welcome/404'), 404); を返します。
Catch all
Fuel が 404 レスポンスステータスを設定していない点を利用して、同ステータスを catch all 機能として利用することが出来ます。 uri に基づいてページをデータベースから取得するようなページモデルを持つことも可能でしょう。 以下、そのようなことを可能とする例を示します:
// Inside your 404 controller
public function action_my404()
{
$original_uri = \Input::uri();
$result = \DB::select()->from('pages')->where('uri', $original_uri)->execute();
if(count($result) === 1)
{
// お好みの (訳注: catch all によるデータベースからのデータ取得) ページを表示
}
else
{
// 一般的な 404 ページを表示
$messages = array('Aw, crap!', 'Bloody Hell!', 'Uh Oh!', 'Nope, not here.', 'Huh?');
$data['title'] = $messages[array_rand($messages)];
return Response(View::forge('welcome/404', $data), 404);
}
}
500 をスローする
アプリケーションを単純に停止し、サーバの不適切な動作エラーを表示することが必要な場合があります。 通常それは 500 Internal Server Error です。
404 エラーをスローするのと同様、500 エラーをスローすることができます。
throw new HttpServerErrorException;