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

# 環境

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

# 前提（ここすごく重要）

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

## 基本１

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

## 基本２(Laravel5.5で追加)

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

## 基本３

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

## 基本使わないけど

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

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

```php
Route::redirect('/about_us', '/about'); // /about_usに来たら/aboutに飛ばす。第3引数にHTTPステータスコードを指定可能(初期値は302)
Route::permanentRedirect('/here', '/there'); // 301ステータスでリダイレクトする(v5.7~)
```

## 別名付ける

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

## URLパラメータ

```php
// 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で削除されました。**

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

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

## resourceルーティング

```php
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

```php
// ネスト出来る&複数指定可能
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(...
```

## モデルとの結合

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

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

});

// 対応するキーを指定する(7.x~)
Route::get('/users/{user:name}', function(App\Models\User $user) {

});

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

// 2つの内容が指定された場合、自動的に親(user)を絞った形でpostsを取得できる(7.x~)
Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});
```

メソッドの引数の名前とルーティングのパラメータ名が一致していてModelである場合は自動モデルバインディングされる。基本は`id`カラムで引っ張ってこようとするので別の名前で引っ張ってきたい場合はEloquent Modelの方に`getRouteKeyName`メソッドを利用して設定しておくか、bindでの取得をやるのが良い。

## fallback(v5.5.5~)

```php
// もし受け取ったリクエストが他のRouteと一致しない場合にこのルーティングを適用する
// この記述を入れたい場合はルート登録では一番最後に記述する必要がある
Route::fallback(function () {
    //
});
```