15
15

More than 5 years have passed since last update.

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

Posted at

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の代わりに作った拡張ファイルを指定する

// 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') で取得ができる

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

参考サイト

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15