PHPフレームワークLaravelを使う Routing
インストールの記事から間が飽きましたが、
の8つのルートが生成されています。
ここまででMVCフレームワークでも見かける設定がひと通り揃ってますね。
以下、ドキュメントを読んでいてこれは便利そうだなと思った機能です。
名前からユーザを特定するなど、ルートパラメータを解決する方法を指定するにはRoute:bindを利用します。
PHPフレームワークLaravelを触ってみているよという記事の第3段です。
クイックスタートは公式ドキュメントにもある上に
多くの方が記事を書いてらっしゃるので特に網羅性は気にせず書いていこうかと思います。
多くの方が記事を書いてらっしゃるので特に網羅性は気にせず書いていこうかと思います。
参考
ルートの定義
app/routes.phpに定義します。
HTTPメソッドがそのままメソッド名になっており、Route::get、Route::postなどととてもわかりやすい記述です。
RESTfulなルート
Route:resource('user', 'userController');
コマンドラインから
$ php artisan routesで確認すると
| メソッド | URI | アクション |
|---|---|---|
| GET | /user | index |
| GET | /user/create | create |
| POST | /user | store |
| GET | /user/{id} | show |
| GET | /user/{id}/edit | edit |
| PUT | /user/{id} | update |
| PATCH | /user/{id} | update |
| DELETE | /user/{id} | destroy |
の8つのルートが生成されています。
HTTPメソッドを指定しないルート
Route::any('foo', function()
{
return 'Hello world';
});
ルートパラメータ
Route::get('user/{id}/{name}', function($id, $name)
{
return $name;
});
※パラメータをオプションにする場合
Route::get('user/{name?}', function($name = 'John')
{
return $name;
});
ルートフィルター
beforeフィルターとafterフィルターを設定可能。
Route::get('user', array('before' => 'age', function()
{
return 'You are over 18 years old.';
}));
フィルターはapp/filters.phpに定義します。 デフォルトではauth、auth.basic、guest、csrfフィルターが用意されています。
Route::filter('age', function()
{
if (Input::get('age') < 18)
{
return Redirect::to('home');
}
});
名前付きルート
Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));
定義しておくと名前からURLを生成可能になります。
$url = URL:route('profile');
$redirect = Redirect:route('profile');
グループ
Route::group(array('before' => 'auth', 'prefix' => 'admin'), function()
{
Route::get('/user', function()
{
// Has Auth Filter
});
Route::get('user/profile', function()
{
// Has Auth Filter
});
});
まとめてフィルターを適用したい時やプレフィックスを付けたい時に利用ここまででMVCフレームワークでも見かける設定がひと通り揃ってますね。
以下、ドキュメントを読んでいてこれは便利そうだなと思った機能です。
サブドメインルーティング
サブドメインをワイルドカードでパラメーターとして処理可能です。 ユーザーごとにサブドメインを割り当てるWebサービスで使えますね。
Route::group(array('domain' => '{account}.example.com'), function()
{
Route::get('user/{id}', function($account, $id)
{
//
});
});
パラメータの制約条件を正規表現で指定
Route::get('user/{id}/{name}', function($id, $name)
{
return $name;
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))
ちゃっちゃと作りたい時に便利そうです。モデルとの結合
ルートからモデルのインスタンスを直接受け取ることができます。 下記の例では、ユーザーIDの代わりにユーザーインスタンスを受取ります。
Route::model('user', 'User');
これでモデルとパラメーターが結合されるので、
Route::get('profile/{user}', function(User $user)
{
//
});
とルートを定義すると関数にはUserインスタンスが渡されます。名前からユーザを特定するなど、ルートパラメータを解決する方法を指定するにはRoute:bindを利用します。
Route::bind('user', function($value, $route)
{
return User::where('name', $value)->first();
});
上手く使えばパラメータの検証部分を共通化して分離できますね。