【Laravel】リクエスト・レスポンスを補完する

こちらの記事は以下の書籍を参考に執筆しました

- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)




前回はミドルウェアの登録までやったので今回はグローバルミドルウェアをやっていく

#グローバルミドルウェア
前回は一つのミドルウェアに一つのアクセスで登録したがすべてのアクセスでミドルウェアを実行できるのはグローバルミドルウェア
##グローバルミドルウェアの登録
Kernel.phpの配列へ追記をして登録する

```php5:Http/Kernel.php
    protected $middleware = [
   ...
    ];
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

グローバルミドルウェアを登録すると個々のミドルウェアの呼び出しは必要無くなる。

```php5:web.php
Route::get('hello', 'HelloController@index')->middleware(HelloMiddleware::class);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

これがこうなる

```php5:web.php
Route::get('hello', 'HelloController@index');
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


#ミドルウェアグループ登録
グループ化して登録する仕組み。
Kernel.phpの$middleGroupsという変数に設定されている。

```php5:Kernel.php
    protected $middlewareGroups = [
        'web' => [
        ..ミドルウェアクラス...
        ],

        'api' => [
        ..ミドルウェアクラス...
        ],
    ];
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

`'web'`と`'api'`という項目がグループ

##グループを利用する
グループに登録する際は、$middlewareに登録していたものを削除する必要がある。

配列に追加する。

```php5:Kernel.php
'hello'=>[\App\Http\Middleware\HelloMiddleware::class,],
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

web.phpを修正

```php5:web.php
Route::get('hello', 'HelloController@index')->middleware('hello');
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


グループの場合はmiddlewareの引数へグループ名をテキスト値で渡す。

#バリデーション
フォームなどでの値の検証をバリテーショという
##バリデーションとは
Larabelではvalidateメソッドを利用できる。
これはコントローラの基底クラスに組み込まれている。
**ValidateRequest**というトレイトの機能。

アクションメソッドからの呼び出しはこう

```php5
$this.->validate($request,[検証設定の配列]);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

|引数|説明|
|---|---|
|第1引数|リクエスト|
|第2引数|検証する設定情報の配列|
配列はこんな感じ

```php5
[
  '項目名'=>'割り当てる検証ルール',
  '項目名'=>'割り当てる検証ルール',
   ....
]
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


##バリデーションの利用

```php5:inndex.blade.php
@section('content')

<p>{{$msg}}</p>
<form action="/hello" method="post">
  <table>
    @csrf
    <tr><th>name:</th><td><input type="text" name="name"></td></tr>
    <tr><th>mail:</th><td><input type="text" name="mail"></td></tr>
    <tr><th>age:</th><td><input type="text" name="age"></td></tr>
    <tr><th></th><td><input type="submit" value="send"></td></tr>
  </table>
</form>

@endsection
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

コントローラを修正

```php5
    public function index(Request $request)
    {
      return view('hello.index',['msg'=>'フォームを入力']);
    }
    public function post(Request $request){
      $validate_rule=[
        'name'=>'required',
        'mail'=>'email',
        'age'=>'numeric|between:0,150',
      ];
      $this->validate($request,$validate_rule);
      return view('hello.index',['msg'=>'正しく入力された']);
    }
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

indexメソッドは単純
バリデーション処理はpostメソッドでやってる。

```php5:web.php
Route::get('hello', 'HelloController@index');
Route::post('hello', 'HelloController@post');
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

POST送信されたときにpostメソッドが呼ばれるようにする。
その後/helloにアクセスして確認する。

##バリデーションの基本処理
```php5
      $validate_rule=[
        'name'=>'required',
        'mail'=>'email',
        'age'=>'numeric|between:0,150',
      ];
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

検証ルールはこの様になっている。
`'age'=>'numeric|between:0,150',`のようにルールは`|`で複数指定できる。
##バリデーションの実行
`$this->validate($request,$validate_rule);`
で実行している。

##エラーメッセージと値の保持
先の例ではどんなエラーが起きたのかわからない。何をどう変更すればいいのか、再入力の時に入力値の保持をやっていく

```php5:index.blade.php
@section('content')

<p>{{$msg}}</p>
@if(count($errors)>0)
<div >
  <ul>
    @foreach($errors->all() as $error)
    <li>{{$error}}</li>
    @endforeach
  </ul>
</div>
@endif
<form action="/hello" method="post">
  <table>
    @csrf
    <tr><th>name:</th><td><input type="text" name="name" value="{{old('name')}}"></td></tr>
    <tr><th>mail:</th><td><input type="text" name="mail" value="{{old('mail')}}"></td></tr>
    <tr><th>age:</th><td><input type="text" name="age" value="{{old('age')}}"></td></tr>
    <tr><th></th><td><input type="submit" value="send"></td></tr>
  </table>
</form>

@endsection
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

これでアクセスしてみると今度はエラーの表示がされる。

##エラーメッセージ表示の仕組み

```php5
@if(count($errors)>0)
<div >
  <ul>
    @foreach($errors->all() as $error)
    <li>{{$error}}</li>
    @endforeach
  </ul>
</div>
@endif
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

$errorsはバリデーションで発生したエラーメッセージをまとめて管理するオブジェクト
これはバリデーションの機能で組み込まれるため、コントローラで設定する必要はない。

これはエラーの表示をしている。

```php5
    @foreach($errors->all() as $error)
    <li>{{$error}}</li>
    @endforeach
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

`$errors->all()`でエラーメッセージを配列にまとめて取り出している。

##前回送信した値
これは<input>のvalueに前回の値を設定すればいい。

```php5
value="{{old('name')}}"
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

oldメソッドを使っていて、これは引数に入力した項目の古い値を返す。
いずれもコントローラはいらずテンプレだけでできる。