Laravel8 大きい変更点(ルーティング)

ふい、豚野郎です。
今日はLaravel8の大きい変更点について書いていきます。
個人的にルーティングが大きいと思うので見て行ってください。
おまけとして、CSRF対策も書いていきます。
(環境構築は事前に済ませてください)

参考：https://e-seventh.com/laravel8-call-controller/
使わせていただきます。

## 1. ルーティング
以下が従来までのルーティングファイルの記述です。

```routes/web.php
<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

// 従来の書き方
Route::get('/', 'FormController@index')->name('form');
Route::post('/store', 'FormController@store')->name('store');
```

以下のエラーが出ます。
![screencapture-localhost-8080-Laravel8-public-2022-05-22-13_32_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497869/14cf74f2-c9f4-9b17-6e81-e8a1b11cad55.png)


Laravel8では、以下の2パターンになりました。
①. 名前空間を書くパターン
```routes/web.php
<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', 'App\Http\Controllers\FormController@index')->name('form');
Route::post('/store', 'App\Http\Controllers\FormController@store')->name('store');
```

②. useするパターン
```routes/web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FormController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', [FormController::class, 'index'])->name('form');
Route::post('/store', [FormController::class, 'store'])->name('store');
```


## 2. CSRF対策(いつからこうなったかわからない)
```resources/views/form.blade.php
<html>

<head>
    <title>テストフォーム</title>
</head>

<body>
    <form action="{{ route('store') }}" method="post">
        @csrf
        <label for="email">テスト</label>
        <input type="text" name="test">
        <input type="submit">
    </form>
</body>

</html>
```
いつから@csrfになったんだろ。
Laravelから離れている期間があったので知りませんでした。
6くらいには使われているみたいです。
ちなみに、以下(古い方)でもCSRF対策はできます。
```resources/views/form.blade.php
<html>

<head>
    <title>テストフォーム</title>
</head>

<body>
    <form action="{{ route('store') }}" method="post">
        {{ csrf_field() }}
        <label for="email">テスト</label>
        <input type="text" name="test">
        <input type="submit">
    </form>
</body>

</html>
```

```app/Http/Controllers/FormController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FormController extends Controller
{
    // フォーム
    public function index() {
        return view('form');
    }

    // 登録(今回はCSRFトークンの確認のため、登録しない)
    public function store(Request $req) {
        dd($req->all());
    }
}
```
dd()で確認しましょう。
![screencapture-localhost-8080-Laravel8-public-2022-05-22-13_52_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497869/a36b4530-9c68-17f6-261f-281675173fb4.png)
送信クリック
![screencapture-localhost-8080-Laravel8-public-store-2022-05-22-13_52_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497869/a74ba937-5c97-ee94-a1c6-912b6d0a5604.png)

ちなみに、LaravelはCSRF対策をしないと、

419
PAGE EXPIRED

となるため、注意が必要です。