フロントコントローラの処理を一通り追いかけてみたので処理の流れを備忘録がてらまとめてみる。
見てる限りは拡張性高そうな感じなのでまとめておくと何かやりたい事が出来た時に役立ちそうな気はする。

基本的な処理の流れ

public/index.php

説明するまでも無いかもだけど、FuelPHPで作成したWebサイトは基本的に/public/の後ろに何を指定してもまず"public/index.php"が呼び出される。
PATH設定したり処理時間・メモリ計算の為に開始時間・メモリを記録してたりするけど、メインとなるのはその後のこの部分

try
{
	$response = Request::forge()->execute()->response();
}
catch (HttpNotFoundException $e)
{
	\Request::reset_request(true);

	$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;
	}
}
見たまんまだけどRequestクラスを生成・処理実行・レスポンス取得(Responseクラス)を行っている。
404かどうかの判定はRequestクラスから"HttpNotFoundException"が発生するかどうかで判断している。
ちなみにcatch部の処理を見れば分かる通り、"route.php"の404要素を取ってくるんだけどClosureかどうか判定して、更にResponseかどうかもチェックしてResponseでなければその中身を元にResponseを生成している。
つまり404ページの指定方法は次の4種類ある事になる。
  • 404ページのURIを指定する方法。一般的。
  • viewsの直下に"404.php"を置いてroute.phpで指定しない方法。
  • 404ページのViewを直接指定してResponseクラスを生成する方法。静的なページ表示するだけならコレでいい。
  • Closureで文字列とか指定して404ページとして表示する方法。わざわざ利用する意味が分からない。
分かり易いようにroutes.phpをそれぞれ書いてみよう。

404ルート指定

先ずは一般的な方法。プロジェクト生成時のデフォルトそのまま

<?php
return array(
'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route );

FuelPHPのデフォルト404ページが表示されますね。 スクリーンショット 2014 05 10 1 05 41

デフォルト404.php使用

次は"404.php"をviews直下に置く方法。"routes.php"からは404要素を消しておく。
 <?php
return array(
'welcome/index', // The default route );


404.php

<!DOCTYPE html>
<html>
<head>
	<title>404</title>
</head>
<body>
    見つかりませんでした!
</body>
</html> 

表示結果 スクリーンショット 2014 05 10 1 19 52

Closure指定(Response)

次はClosureでResponseを生成する方法。
 <?php
return array(
'welcome/index', // The default route '_404_' => function() { return Response::forge(View::forge('notfound'),404);}, // The main 404 route );

views/notfound.php
<!DOCTYPE html>
<html>
<head>
	<title>NotFound</title>
</head>
<body>
    Page NotFound!
</body>
</html>

表示結果。引数でステータスコード与えてるのでちゃんとヘッダーのステータスコードも404になっている。
スクリーンショット 2014 05 10 1 51 24

Closure指定(文字列)

最後にClosureで文字列指定する方法。

<?php
return array(
'welcome/index', // The default route '_404_' => function() { return "404なんですよ!";}, // The main 404 route );
設定した文字列だけが帰ってくる。 スクリーンショット 2014 05 10 1 27 55 だけどこの処理、ステータスコードがデフォルトのままなので200で帰ってくる。
これを404にしたい場合は"index.php"を修正する必要がある。

63行目のResponse::forgeの引数に404ステータスコードを追加。

$response = Response::forge($response, 404);
これでちゃんとステータスコードも404として返るようになった。 スクリーンショット 2014 05 10 1 31 28
HttpNotFoundExceptionをCatchした時の処理なんだからデフォルトで404付けておいてくれたらいいのに、何故デフォルトで書いて無いのかは不明。
ただの書き忘れ?まああんまり使わないだろうしこのルート…
書き始めると思った以上に404の解説で長くなってしまった…
急遽タイトルに「404エラー編」を追加して、本日の記事を締めておこうと思う。
Requestの中身は明日必ず記事に……Zzzz