Laravel5.4で使えるルーティングチートシート


## ファイル分割
`routes/user.php`と`routes/admin.php`でルーティングファイルを分ける例

```php:app/Providers/RouteServiceProvider.php

  public function map()
  {
    $this->mapUserRoutes();
  
    $this->mapAdminRoutes();
  }

  protected function mapUserRoutes()
  {
    Route::middleware('web')->namespace($this->namespace)->group(base_path('routes/user.php'));
  }
  
  protected function mapAdminRoutes()
  {
    Route::middleware('web')->namespace($this->namespace)->group(base_path('routes/admin.php'));
  }

```

## middleware
```php
Route::group(['middleware' => 'auth'], function() {
  Route::get('/', 'HomeController@index');
  Route::get('hoge', 'HomeController@hoge');
});
```

## namespace
```php
Route::group(['namespace' => 'Admin'], function() {
  // app/Http/Controllers/Admin/HomeController.php
  Route::get('/', 'HomeController@index');
});
```

## prefix
```php
Route::group(['prefix' => 'admin'], function() {
  // /admin にapp/Http/Controllers/HomeController.phpを割り当てる
  Route::get('/', 'HomeController@index');
});
```

## サブドメインルーティング
```php
Route::group(['domain' => '{account}.myapp.com'], function () {
  Route::get('user/{id}', function ($account, $id) {
    //
  });
});
```


## name

```php
Route::get('/', 'HomeController@index')->name('home');
```

## resource
```php
Route::resource('hoge', 'Hoge\MainController');
```

### [option] only
indexとshowしかいらない場合

```php
Route::resource('hoge', 'Hoge\MainController', ['only' => ['index', 'show']]);
```

### [option] except
indexとshowはいらない場合

```php
Route::resource('hoge', 'Hoge\MainController', ['except' => ['index', 'show']]);
```

### [option] names
あんまり扱わないけど、Hoge\MainController@indexのルーティング名（`hoge.index`）を`fuga`に変更したい場合

```php
Route::resource('hoge', 'Hoge\MainController', ['names' => ['index' => 'fuga']]);
```

### [option] as
`prefix`や`namespace`と合わせて使う場面が多い。resourceで名前にprefixをつける。
下記は`admin.hoge.index`, `admin.hoge.show`...（以下略）となる。

```php
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {  
  Route::resource('hoge', 'Hoge\MainController', ['as' => 'admin']);
});
```

## HTTP METHOD
```php
// テストに出るやつ
Route::get('/', 'Hoge\MainController@index');
Route::post('store', 'Hoge\MainController@store');
Route::patch('update', 'Hoge\MainController@update');
Route::delete('destroy', 'Hoge\MainController@destroy');
Route::options('foo', 'Hoge\MainController@foo');
Route::match(['get', 'post'], 'bar', 'Hoge\MainController@bar');

// あまり使わない
Route::put('fuga', 'Hoge\MainController@fuga');
Route::any('bar', 'Hoge\MainController@bar');
```

## パラメータ
```php
Route::get('/users/{id}', 'User\MainController@show');
```

コントローラはこんな感じ

```php:app/Http/Controller/User/MainController.php
public function show($id)
{
  //
}
```

### 任意パラメータ
```php
Route::get('/users/{name?}', 'User\MainController@show');
```

### パラメータの制約
```php
Route::get('/users/{id}/{name}', 'User\MainController@show')->where(
  ['id' => '[0-9]+', 'name' => '[a-z]+']
);
```

## モデルとの結合
API作るときに便利そう

```php
Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});
```

デフォルトはid検索のため、変えたい場合はモデルに記述する

```php
public function getRouteKeyName()
{
  return 'name';
}
```

## 参考
- [Laravel 5.4 ルーティング](https://readouble.com/laravel/5.4/ja/routing.html)
- [Laravel named route for resource controller](http://stackoverflow.com/questions/25290229/laravel-named-route-for-resource-controller)