PHP
laravel

Laravelのルーティングチートシート

環境

  • Laravel5.1で動くものを前提としています。
  • ただ、5.2以降に関しても補足を入れています。

前提

  • Laravelのルーティングの基本がわかってること。
  • ルーティングの設定は先に書かれたやつのほうが優先度が高い
  • グループはネストできる

基本1

Route::get('/', function() { return 'Hello, World!' });
// URL出力
url('/');

基本2(Laravel5.5で追加)

Route::view('/', 'home'); // viewを直指定するやつ
Route::view('/', 'home', ["foo" => "bar"]); // パラメータも渡せる

基本3

Route::get('/',    'HomeController@index');
Route::post('/',   'HomeController@post');
Route::put('/',    'HomeController@put');
Route::delete('/', 'HomeController@destroy');
// URL出力
action('HomeController@index');

基本使わないけど

Route::match(['get', 'post'], 'foo','HomeController@index'); // GET,POST両方ここに通す
Route::any('bar', function(){}); // 全てのHTTPメソッドに適用

リダイレクト(Laravel5.5から)

Route::redirect('/about_us', '/about'); // /about_usに来たら/aboutに飛ばす。第3引数にHTTPステータスコードを指定可能

別名付ける

Route::get('/', ['uses' => 'HomeController@index', 'as' => 'home']);
Route::get('/', 'HomeController@index')->name('home');
// URL出力
route('home');

URLパラメータ

// idパラメータが無かったらエラー
Route::get('user/{id}', function($id) { return view('user.index', ['user' => User::find($id)]); });

// nameパラメータが含まれてなくても通す
Route::get('foo/{name?}', 'FooController@index');

// whereでパラメータを正規表現バリデーション出来る
Route::get('foo/{name?}', 'FooController@index')->where('name', '[A-Za-z]+');

// グローバル適用されるパラメータの正規表現バリデーション
// (RouteServiceProviderのbootメソッドに追加(parentより前))
$router->pattern('id', '[0-9]+');
// Route::whenはあまり推奨されてない模様→5.2で削除された模様

controllerルーティング

※5.2で非推奨。5.3で削除されました。

Route::controller('users', 'UserController');
// getIndexとかpostIndexとかControllerで設定すればアクセスできるようになる

// asを付けたい場合
Route::controller('users', 'UserController', [
  'getIndex' => 'users.index'
]);

resourceルーティング

Route::resource('photos', 'PhotoController');
// [GET](/photos)           ->index
// [GET](/photos/{id})      ->show($id)
// [GET](/photos/create)    ->create
// [POST](/photos)          ->store
// [GET](/photos/{id})      ->edit($id)
// [PUT/PATCH](/photos/{id})->update($id)
// [DELETE](/photos/{id})   ->destroy($id)

// ネストも出来る
Route::resource('photos.comments', 'PhotoCommentController');
// URLはこんな感じになる( photos/{photoId}/comments/{commentId} )

// only,except
Route::resource('photos', 'PhotoController', [
  'only' => ['index', 'show']
]);

// 5.4からはapi向けのresourceルーティングメソッドが追加
Route::apiResource('photos', 'PhotoController');
// resourceメソッドのcreate,editを省いただけのやつです

group

// ネスト出来る&複数指定可能
Route::group([パラメータ => パラメータ値], function(){

});
// パラメータ一覧
// middleware ... ミドルウェア適用
// namespace ... 名前空間適用(Adminなら'App\Http\Controllers\Admin'以下)
// domain ... サブドメイン適用({account}.myapp.com)
// prefix ... プレフィックス付与(adminとかuser/{user_id}とか)

// なお5.4あたりからチェーンメソッドとして記述も出来るようになりました(Fluent Routing)
// 以前まではgetやpostを書いた後のチェーンはできてたがgroupの部分は最近から
// Route::prefix('admin')
//      ->middleware('admin')
//      ->get(...

モデルとの結合

// RouteServiceProviderのbootメソッドに追加(parentより後)
// この追加は5.2なら不要。自動でインジェクションされるみたい
$router->model('user', 'App\Models\User');

// ルーティング(find({user})した結果が$userに入るたぶん)
Route::get('/users/{user}', function(App\Models\User $user) {

  });

// なお、router->modelじゃなくてbindなら独自設定も可能(つまりキャッシュとかも出来るはず)
$router->bind('user', function($value) {
  return App\Models\User::where('name', $value)->first();
  });