LaravelのFormRequestでValidationエラーメッセージを日本語化する

LaravelのFormRequestでValidationルールの外部ファイル化と、項目名とエラーメッセージを日本語化する方法。
自分用の備忘としてメモ。

## Requestファイルの準備

### artisanでRequestの拡張を作る。

```
php artisan make:request CreateUserRequest
```

### 作成されたファイルにValidationルールを書く

`rules()`には、`'フィールド名' => 'ルール'`の形式でValidationルール。
`attributes()`には、`'フィールド名' => '項目名'`の形式で項目名。
`messages()`には、`'フィールド名.ルール' => 'メッセージ'`の形式でメッセージ。 

```CreateUserRequest.php

namespace App\Http\Requests;
use App\Http\Requests\Request;

use Illuminate\Foundation\Http\FormRequest;

class CreateUserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    /**
     * Validationルール
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required',
            'zip' => 'required',
            'prefecture' => 'required',
            'city' => 'required',
            'address' => 'required',
            'tel' => 'required',
            'email' => 'required|email'
        ];
    }

    /**
     * 項目名
     *
     * @return array
     */
    public function attributes()
    {
        return [
            'name' => '氏名',
            'zip' => '郵便番号',
            'prefecture' => '都道府県',
            'city' => '市区町村',
            'address' => '番地・ビル名',
            'tel' => '電話番号',
            'email' => 'E-mail'
        ];
    }

    /**
     * エラーメッセージ
     *
     * @return array
     */
    public function messages() {
        return [
            'name.required' => ':attributeは必須項目です。',
            'zip.required' => ':attributeは必須項目です。',
            'pref_id.required' => ':attributeは必須項目です。',
            'city.required' => ':attributeは必須項目です。',
            'address.required' => ':attributeは必須項目です。',
            'tel.required' => ':attributeは必須項目です。',
            'email.required' => ':attributeは必須項目です。',
            'email.email' => ':attributeはメールアドレスの形式で入力してください。'
        ];
    }

    /**
     * fillable
     * Modelの$fillableではなく、Requestのonlyで入力値を制御
     *
     * @return array
     */
    public function userAttributes()
    {
        return $this->only([
            'name',
            'zip',
            'prefecture',
            'city',
            'address',
            'tel',
            'email',
        ]);
    }
}
```

## Controllerで使う

### Requestの代わりに作った拡張ファイルを指定する

```php
// use 追加
use App\Http\Requests\CreateUserRequest;

public function index()
{
    return view("index");
}

public function update(CreateUserRequest $request)
{
    // validationが通った状態かつ、userAttributesに書いたキーでフィルタリングされたpostデータが取れる。
    // この時点でvalidationエラーが発生したら入力前の画面に戻ってくれる
    $data = $request->userAttributes();
}
```

## Viewで使う

Validationエラーは `$errors->has('name')` でチェックができる。
`$errors->first('name')` でエラーメッセージが取得できる。
入力値は `old('name')` で取得ができる

```html
<form action="" method="post">
    <input type="text" name="name" value="{{ old('name') }}">
    @if($errors->has('name'))<span>{{ $errors->first('name') }}</span>@endif
</form>
```



## 参考サイト


- https://readouble.com/laravel/5.5/ja/validation.html
- https://qiita.com/toro_ponz/items/b33c757cb7ba5bb48ed4
- https://qiita.com/sakuraya/items/abca057a424fa9b5a187
- https://tnamao.hatenablog.com/entry/2015/10/04/175345