昨日『PHPフレームワークLaravelの導入』でも述べましたが、Laravelの面白いところは、アプリケーションロジックをコントローラだけで無く、routes.phpに直接記述することが出来る点です。ちょっとしたプログラムならわざわざコントローラに記述しなくても、ルーティングの指定と共に、記述できるという事です。そこで、今日は、Laravelのルーティングについて調べてみたいと思います。
ルーティングの基本
1. ルーティングは、GET、POST、PUT、DELETE、及び全てのHTTP変数に対するルート(ANY)を指定することが出来ます。それでは例を見てみましょう。
laravel/application/routes.php
Route::get('/',function(){ echo 'おはよう<br>'; return "Hello World!"; echo 'こんばんは'; });
Ruoteクラスのgetメソッドは、第1引数に、ルーティングを登録するルートを指定します。第2引数はそのルートで行うロジックを含む関数を指定します。第1引数のルートにはデフォルトルート以外、先頭の/は付けませんので、注意して下さい。
2行目はechoで文字列を表示していますが、3行目は単にreturnだけで文字列を表示しています。echoが無くても文字列を表示できるのは面白いですね。尚、当然ですが、return後のechoは表示されません。
2. ブラウザで確認してみます。
3. GET以外の上記メソッドも基本的に使い方は同じですので、省略します。尚、ルートは登録された順番に評価されるみたいですので、『全てに当てはまる』ルートはroutes.phpの最後に追加する必要があります。
ルートフィルター
4. ルートフィルターは、あるルートが実行される前後に実行されます。もし、beforeフィルターが値を返したら、その値はリクエストに対するレスポンスだと見なされ、そのルートは実行されません。それでは実際に試してみましょう。
laravel/application/routes.php
//フィルターを登録する Route::filter('filter',function(){ return 'フィルターです'; }); //ルートにフィルターを付ける Route::get('/',array('before'=>'filter',function(){ return 'トップページです'; }));
5. ブラウザを表示してみます。
6. 2行目から4行目をコメントアウトしてみます。
laravel/application/routes.php
//フィルターを登録する /*Route::filter('filter',function(){ return 'フィルターです'; });*/ //ルートにフィルターを付ける Route::get('/',array('before'=>'filter',function(){ return 'トップページです'; }));
7. 下記のように表示されました。指定したbeforeフィルターが無くてもエラーは表示されないみたいですね。
8. ルートにafterフィルターを付けてみます。
laravel/application/routes.php
//フィルターを登録する Route::filter('filter',function(){ echo 'フィルターです'; }); //ルートにフィルターを付ける Route::get('/',array('after'=>'filter',function(){ echo 'トップページです'; }));
9. ブラウザを表示してみます。下記のようになりました。
パターンフィルター
10. Laravelでは、特定のURIで始まるルート全部にフィルターを付ける事も簡単にできます。例えば'auth'フィルターを'admin'で始まるURIに対する全てのリクエストに適用したい場合などに便利です。それでは実際に試してみましょう。前回作成したHelloコントローラを下記のように修正します。
laravel/application/controllers/hello.php
<?php class Hello_Controller extends Base_Controller{ public function action_index(){ echo "Indexアクションです"; } public function action_test(){ echo "testアクションです"; } }
11. routes.phpに下記のコードを追加します。
laravel/application/routes.php
Route::filter('pattern: hello/*',array('name'=>'filter',function(){ echo 'Hello World!<br>'; }));
12. ブラウザで表示してみます。Helloコントローラの両方のアクションに同じパターンフィルターが適用されているのが分かると思います。
名前付きルート
13. Laravelでは、名前付きルートを作成することで、アプリケーション全体を通じて、ルートに付けた名前で参照することが出来るようになります。これはかなり便利ですね。たとえルートの変更が生じてもLaravelが自動的に新しいルートを指定してくれます。それでは実際に試してみましょう。routes.phpに下記のコードを追加します。
laravel/application/routes.php
//名前付きルートを登録する Route::get('hello/test',array('as'=>'test',function(){ echo "名前付きルートのテストです"; })); //名前付きルートへリダイレクトする Route::get('hello',function(){ return Redirect::to_route('test'); });
14. ブラウザにhttp://localhost/laravel/public/helloと入力してみます。下記のようにアドレスが書き換わってリダイレクトしました。
http://localhost/laravel/pulbic/hello/test
バンドルルート
15. バンドルはLaravelのモジュールパッケージシステムです。アプリケーションに対するリクエストを簡単にバンドルに処理させることが出来ます。applicationフォルダのbundles.phpファイルを開き下記のようにコードを追加してみます。
laravel/application/bundles.php
return array( 'docs' => array('handles' => 'docs'), 'admin' => array('handles' => 'admin'), );
'docs'は、元々作成されていましたので、'admin'を追加しました。handlesオプションで、指定した文字で始まるURIのリクエストが全て、Bundlesフォルダに行くようになります。すなわち、docsで始まるURIのリクエストはDocsバンドルへ、adminで始まるURIのリクエストはAdminバンドルへ行くようになります。
16. 次に、バンドルのルートフォルダにadminフォルダを作成し、その中にroutes.phpファイルを作成します。以下のコードを記述します。
laravel/bundles/admin/routes.php
<?php Route::get('(:bundle)',function(){ return 'これはAdminバンドルです'; });
(:bunlde)プレースホルダーは、Adminバンドルを登録するときに作成したhandlesの値に置き換わります。つまり、(:bundle)はadminを指定しているのと同じなのです。これは、バンドルを使用している人が、定義したルートを壊さずに、バンドルルートへのURIを変更できるようにしてくれる便利な機能です。
17. ブラウザでアドレスを入力してみましょう。
http://localhost/laravel/public/admin
これまた、かなり便利ですね。ますますLaravelが面白くなってきました。
次回は、『Laravelのコントローラ』について調べてみます。
本日は以上です。