【Laravel】バリデーションやフォームリクエストのattributesとは？カスタム属性名の設定方法

バリデーション関連のファイルで`attributes`というのが出てくる。この役割と使い方について。

##目次

1. [いつ使うか？](#いつ使うか)
2. [属性名の変更方法](#属性名の変更方法)
3. [フォームリクエストを使用している場合](#フォームリクエストを使用している場合)


<br>
##いつ使うか？
バリデーションでデフォルトのエラーメッセージを表示すると、その属性名が表示される。この属性名は変数で適用されている。

`attributes`を編集することで、この属性名を好きな値に変更することができる。


<br>
###デフォルトの設定例
`name`属性に以下バリデーションが適用されている場合

```php:バリデーションルール
'name' => 'required|min:3|max:10',
```

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/c76edbde-b0db-a9dd-3c75-18ca324ee059.png)|
|:--|

resources > lang > en > validation.php で定義された内容が表示されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/1a7de9e8-26a4-b7de-4be6-73fe95939af1.png)


```php:validation.php
    'min' => [
        'string' => 'The :attribute must be at least :min characters.',
    ],
```

ここで、属性名は`:attribute`というように可変な値で定義されている。


<br>
###属性名の変更方法
上記validation.phpの一番下にある`attributes`に追記する。

```php:validation.php
    'attributes' => [
        'name' => '名前',
    ],
```

<br>
**▼実行例**

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/91b04c98-e446-0b21-8399-0921c3ef95b9.png)|
|:--|

`:attribute`の部分が指定した「名前」に変更されている。


<br>
##メッセージを変更する方法
メッセージを変更したい場合は、同ファイルの下の方にある`custom`に追記する。


```php:validation.php
    'custom' => [
        //以下追記
        'name' => [
            'min' => ':attributeは:min 文字以上で入力してください'
        ],
    ],
```

<br>
**▼実行例**

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/ac4ad600-df0a-5197-f61b-458b2f52c7c3.png)|
|:--|


<br>
##日本語化
現在、enディレクトリ配下のファイルをいじっているが、日本語なので、本来はjaディレクトリのファイルをいじるべき。

日本語化の方法は[こちら](https://qiita.com/yuta-38/items/bc1dd1e63749186a4a7b#3-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E8%A8%80%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参照。



<br>
##フォームリクエストを使用している場合
フォームリクエストを使用している場合、**各ファイルのクラスの定義内で`attribute`を設定することができる**。

・[フォームリクエストとは？](https://qiita.com/yuta-38/items/296fa3ef5e33feea12c4)


###フォームリクエストにカスタム属性を追加
`attributes`メソッドを新たに作成する。

```php:作成例
    public function attributes()
    {
        return [
            'name' => '名前',
        ];
    }
```

<br>
**▼フォームリクエストの設定例**

```php:MailFormRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required|min:3|max:10',
        ];
    }


    public function messages()
    {
        return [
            'name.required' => '名前を入力して下さい。',
            'name.max' => ':attributeは:max文字以下で入力して下さい。',
            'name.min' => ':attributeは:min文字以上で入力して下さい。',
        ];
    }

    public function attributes()
    {
        return [
            'name' => '名前',
        ];
    }
}
```

**▼バリデーション実行結果**

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/dfdfb7f8-054d-9688-8af3-95a04149e579.png)|
|:--|