チュートリアル HTTPエラー処理その2
おはようございます。SAN値0のゆうきんです。
前回に引き続きHTTPエラー処理の説明を行います。
今回は、404と500以外のエラーを返す方法について説明します。
方法は2種類あります。順に説明します。
1,404と500以外のエラーを返す簡単な方法
1 2 3 4 |
public function action_error() { return new \Response(null, 405); } |
これで、明示的に405エラーを返すことができます。
今回はnullとしましたが、第1引数にビューオブジェクトを渡すと、それが表示されます。
なお、nullだと真っ白の画面が表示されます。
Response クラスには他の使い方もあるのですが、記事の項目が違うため割愛します。
2,エラーを定義し、それを投げる
1の方法で全て解決できますが、1の方法だとエラーを返したい場所ごとに書かなければならないため、非常に面倒くさいです。
404と500を明示的に返すときと同じように、例外を投げるだけにしたいですよね?
そこでエラーを定義したクラスを作り、それを例外として投げる方法を説します。
今回は405エラーを作成することを前提にして説明します。
まずは、 fuel/app/classes/ に httpexceptions.php というファイルを作成して下さい。
そして、以下のクラスを記述して下さい。
1 2 3 4 5 6 7 |
class HttpMethodNotAllowd extends Fuel\Core\HttpException { public function response() { return new Response(View::forge('errors/405'), 405); } } |
1の方法とほぼ同じです。
今回は、第1引数でビューオブジェクトを生成して渡していますが、適当なビューファイルを用意して下さい。
この場合は405エラーだと視覚的にわかるビューが最適だと思われます。
定義したいエラーが増えるたびに、この httpexceptions.php にクラスを追加していくことになるので、覚えておいて下さい。
クラス名は定義したいHTTPエラーコードに準じた名前にするとわかりやすくていいです。
記述が終わったら、 fuel/app/bootstrap.php を開き、次のように書き加えて下さい。
1 2 3 4 5 |
Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'HttpMethodNotAllowd' => APPPATH.'classes/httpexceptions.php', )); |
‘HttpMethodNotAllowd’ が定義したエラークラス名、 APPPATH.’classess/httpexceptions.php’ がエラークラスを定義しているファイル名となります。
ここまで終わったら下準備は同じです。
後は、404と500と同じように例外を投げるだけです。
1 2 3 4 |
public function action_405error() { throw new HttpMethodNotAllowd; } |
これで405エラーを明示的に返すことが可能となります。
さらに。この方法を使用すれば、404と同じように405が発生したらこのページにルーティングするという設定を適用することができます。
ただし、またいろいろと手を加える必要があります。
その方法は次の項目をご覧ください。
3,2で発生させた例外にルート設定を行う
この項目は2の項目で定義した405に対してルーティングを行うことを前提とします。
2で発生させた例外は public/index.php で受け取ることが可能です。
なので、以下の通りに書き加えて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
// 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 instanceof Closure) { $response = $route(); if( ! $response instanceof Response) { $response = Response::forge($response); } } elseif ($route) { $response = Request::forge($route, false)->execute()->response(); } else { throw $e; } } catch (HttpMethodNotAllowd $e) { $route = array_key_exists('_405_', Router::$routes) ? Router::$routes['_405_']->translation : Config::get('routes._405_'); if($route instanceof Closure) { $response = $route(); if( ! $response instanceof Response) { $response = Response::forge($response); } } elseif ($route) { $response = Request::forge($route, false)->execute()->response(); } else { throw $e; } } |
catch文で、さきほど定義した例外 HttpMethodNotAllowd を受け取り、ルート設定があれば、そちらにルーティングし、なければ2で生成したビューがそのまま表示されます。
ルート _405_ を fuel/config/routes.php で定義していれば、そちらにルートされるということです。
catch文の中で _405_ があれば・・・とやっています。
つまり _405_ という名前は自由に変更できます。が、変数の命名はなるべく揃えた方がわかりやすので、このままで良いでしょう。
以上で、HTTPエラー処理の説明を終わります。
以前説明した、モードで処理を切り替える方法などを複合すれば、開発環境では405エラーを発生させるが、製品環境では404エラーとする、ということが可能です。
下準備は手間ですが、一度作成してしまえば繰り返し使えるので非常に便利です。
では、おやすみなさい。