Laravelルーティング

Laravelにおけるルーティングを説明していきます。

#ルーティングとは
ブラウザから任意のURLアクセスがあった場合、どのController処理を動かすのかを定義するところになります。記述する場所は`routes/web.php`になります。またHTTPメソッド（GET,POST,PUT等）も定義できます。下記のイラストの①の部分にあたります。
![imager.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F592457%2Feaa5bba7-9f47-284e-f2b3-1e763f99c0f3.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=58555dca816088974acb1b7184648ddd)
#ルーティングの書き方
記載する場所は`routes/web.php`になります。
例）　ブログ一覧を表示したい

```php:routes/web.php
Route::get('blogs','BlogContoller@showlist');
```
左から順に説明します。
1. Laravel既存機能のRouteファサードを使う(Route)
2. HTTPメソッドの指定(get)
3. 任意のURLを指定(blogs)
4. 作ったControllerを指定(BlogContoller)
5. Controllerのメソッドを指定(showlist)



#名前付きルート
作成したRouteに名前をつける事ができます。これにより特定のルートへのURLを生成したり、リダイレクトしたりする場合に便利です。ルート定義に`name`メソッドをチェーンする事で名前がつけられます。

```php:routes/web.php
Route::get('/','BlogContoller@showlist')->name('blogs');
```

###生成＋リダイレクト
ルートに一度名前を付ければ、その名前をグローバルな`route`関数で使用すればURLを生成したり、リダイレクトしたりできます。

```php
//URLの生成
$url = route('blogs');
//リダイレクトの生成
return redirect()->route('profile');
```

###URLを一括で変更できる
viewで

```php
{{ url('/users/1/profile')}}
```
上記のように書いてしまうと、URLを変更する際にviewの中から同じ箇所を探さないといけなくなってしまいますが、

```php
{{ route('user.profile',['id' => 1])}}
```
としていれば、`routes/web.php`のみを変更すればよくなります。


##resource
resourceはリソースコントローラーと呼ばれ、一般的なCRUD（投稿、一覧、更新、削除、詳細）操作を予めLaravel側で用意してくれるものです。web.phpでHTTP動詞を`Route::resource`とする事で以下のメソッドを定義した扱いとなります。また、`name()`も勝手に付与してくれます。
1. index(一覧)
2. show(詳細)
3. create(作成画面)
4. store(作成処理)
5. edit(編集画面)
6. update(編集処理)
7. destroy(削除処理)

これにより、かなりのコード短縮化が図れます。
`一つずつ`

```php:web.php
Route::get('admin/post', 'Admin/PostController@index')->name('admin.post.index');
    Route::get('admin/post/show/{id}', 'Admin/PostController@show')->name('admin.post.show');
    Route::get('admin/post/create', 'Admin/PostController@create')->name('admin.post.create');
    Route::post('admin/post/store', 'Admin/PostController@store')->name('admin.post.store');
    Route::get('admin/post/edit/{id}', 'Admin/PostController@edit')->name('admin.post.edit');
    Route::post('admin/post/update/{id}', 'Admin/PostController@update')->name('admin.post.update');
    Route::post('admin/post/destroy/{id}', 'Admin/PostController@destroy')->name('admin.post.destroy');
```
`resource版`

```php
Route::resourcre('post','PostController');
```

また、以下のartisanコマンドで対応するコントローラとメソッドを自動生成してくれます。

```terminal
$ php artisan make:controller PhotoController --resource
```

```php:PhotoController
//コマンド入力で自動的に作成される
namespace App\Http\Controllers;
class PhotoController extends Controller
{
    public function index()
    {
        //
    }

    public function create()
    {
        //
    }

    public function store(Request $request)
    {
        //
    }

    public function show($id)
    {
        //
    }

    public function edit($id)
    {
        //
    }

    public function update(Request $request, $id)
    {
        //
    }

    public function destroy($id)
    {
        //
    }
}
```

###onlyオプション/exeptオプション
これにより、resource使った時のルーティングを制限する事ができるので、余計なルーティングを生成しないで済みます。

```php:routes/web.php
//edit,updateのルーティングを削除

//only
Route::resource('hoge', 'HogeController', ['only' => ['index','create','show','store','destroy']]);
//except
Route::resource('hoge', 'HogeController',[except => ['edit','update']]);
```




###resource懸念点
実務で`resource`を使ってしまうと、使わないルートまで定義されてしまうので、「個別で書いた方がいい」、「only,exceptオプションを使う」という意見があるらしいです。使う用途によって使い分けた方が良さそうです。






#終わりに
参考サイト
https://qiita.com/sympe/items/9297f41d5f7a9d91aa11
https://qiita.com/namizatork/items/78487c2504b7ad4faf27