Laravelでのバリデーション（値チェック）の方法

Laravelでのバリデーション（値チェック）の方法を紹介します。

#サンプルblade
```html

<div class="wrapper">
    @if(count($errors) > 0)
        <ul class="bg-danger">
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    @endif

    <form action="{{ route('sample.store') }}" method="post">
        @csrf
        <div class="form-group">
            <label>名称<span class="required">※必須</span></label>
            <input type="text" name="name" class="form-control">
        </div>

        <div class="form-group">
            <label>チェックボックス<span class="required">※必須</span></label>
            <div class="checkbox">
                <label class="checkbox-inline">
                    <input type="checkbox" name="checkbox[]" value="1">A
                </label>
                <label class="checkbox-inline">
                    <input type="checkbox" name="checkbox[]" value="2">B
                </label>
                <label class="checkbox-inline">
                    <input type="checkbox" name="checkbox[]" value="3">C
                </label>
            </div>
        </div>

        <div class="form-group">
            <label>ラジオボタン<span class="required">※必須</span></label>
            <div class="radio">
                <label class="radio-inline">
                    <input type="radio" name="radio" value="1">A
                </label>
                <label class="radio-inline">
                    <input type="radio" name="radio" value="2">B
                </label>
                <label class="radio-inline">
                    <input type="radio" name="radio" value="3">C
                </label>
            </div>
        </div>

        <button type="submit" class="btn btn-success">登録</button>
    </form>
</div>
```

#バリデーションルール作成
以下のコマンドを実行します

```
$ php artisan make:request ValidateSample
```

すると、以下のファイルが作成されます。

```php:app/Http/Requests/ValidateSample.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ValidateSample extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}
```

まず、`authorize`メソッドの`return false`を`return true`に修正します。 
（本来は権限チェックが必要な場合は、ここでチェックすることもできます。でも他の箇所ですることが多いです。）  

では、`rules`メソッドの中を書いていきます。

```php
public function rules()
{
    return [
        'name' => 'required|max:30',
        'checkbox' => 'required',
        'radio' => 'required',
    ];
}
```

連想配列のキーが、html側のnameと一致させるように書きます。 
連想配列の値に適用したいルールを書きます。  
ルールは[こちら](https://readouble.com/laravel/5.8/ja/validation.html)の「使用可能なバリデーションルール」を参照。 
（使うものはだいたい限られますが）  

続いて、作成したルールが適用されるようにControllerを修正します。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests\ValidateSample; //★追加★

class SampleController extends Controller
{
    ...
```

```php
public function store(ValidateSample $request) //★もともとRequestだった箇所をValidateSampleに置き換え★
{
    ...
```

では、画面から登録ボタンを押してみましょう。  
  

![スクリーンショット 2019-05-07 14.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/e097d052-8918-58d1-08bb-ba4c5348f6f7.png)


あ！エラーメッセージが英語だったぞ...

エラーメッセージを日本語化する場合は、[こちら](https://github.com/caouecs/Laravel-lang/tree/master/src/ja)から日本語ファイルを持ってくると便利です。 
（今回、関係あるのは`validation.php`だけですが...）
配置する場所は`resources/lang/ja`の中です。

すると、こうなります。
![スクリーンショット 2019-05-07 14.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/fd4c07f4-122d-4c83-a310-de1a696038e1.png)


いや、ちょっと英語残ってるやんけ。  
というわけで、先程作成したバリデーションファイルに`attributes`メソッドを追加します。  

```php:app/Http/Requests/ValidateSample.php
public function attributes()
{
    return [
        'name' => '名称',
        'checkbox' => 'チェックボックス',
        'radio' => 'ラジオボタン',
    ];
}
```

連想配列のキーにhtmlのname属性、値に日本語訳をつっこみます。で、登録！

![スクリーンショット 2019-05-07 15.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/e8cfc0ad-bd23-f8d7-9822-e6b054563a80.png)


よし！日本語なった！ 
あー、でも、もうちょっと親切なメッセージにしたいぜ。というそこのアナタ！  
`messages`メソッドを追加しましょう。  

```php:app/Http/Requests/ValidateSample.php
public function messages()
{
    return [
        'checkbox.required' => 'チェックボックスは最低１つはチェックを入れてください。',
    ];
}
```

連想配列のキーに、htmlのname属性と、さらに`.`でつなげて、バリデーションの値を書きます。 
連想配列の値はフルメッセージです。  

すると、こうなる。
![スクリーンショット 2019-05-07 14.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/b53fcb11-0fa9-9b0a-dcab-268905432198.png)


#おわりに
基本的にwebシステムなどを作成するときは、JavaScriptとphp両方でバリデーションすると思いますので、あまりphpのエラーメッセージは重要視されないかもしれませんが...  

JavaScriptでやれば、エラーメッセージを対象の項目の下に出すのも楽ですからね。（私はVue.jsを使用しています）  
マスター関連とかは、めんどくさくなってphpだけにしちゃったりしますので、そういうときに結構役立つかも。  

そういえば、エラーになったときに、前回の入力値はどうやって表示するの？という疑問を持った方のための記事も作成する予定です。