Self-Curation

新卒社会人で営業マンになりました

Laravel#8 バリデーションチェックの実装と日本語化

f:id:scuration:20200802232227p:plain



使用環境

Laravel Framework 7.28.3

バリデーションとは


バリデーションとは入力フォームにおいて妥当性を検証する機能です。


例えば問い合わせフォームを作成する際には、以下の要件が考えられます。

・名前欄や問い合わせ内容を必須項目にしたい。

・連絡先電話番号に正しい値を入れて欲しい。


制作側が意図した値が入らないようにするためにはバリデーションチェックを設ける必要があります。

バリデーションを作成する方法は2つ


バリデーションで入力フォームを制御する方法は、以下の2パターンがあります。


①入力フォームのControllerでValidation関数を使う
②FormReqestというバリデーション専用の独立したファイルを作成


①の方法を試したわけではありませんが、
個人的にはControllerの記述量が減るので②の方が煩わしさは減ると考えています。


なので今回は②のFormRequestを使った方法を記載したいと思います。

バリデーションの設定方法

FormReqestファイルを作成


以下コマンドを実行するとapp\http\reqestsに任意の名前のファイルが作成されます。

php artisan make:request CreatePostRequest


app\Http\Requests\CreatePostRequest.phpを開くとデフォルトで以下のように記述されてます。
FormRequestクラスが継承されているのが分かりますね。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreatePostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
//デフォルトでfalseになっているがtrueに変更
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [[
//フォームの入力ルールを記載
        ];
    }
}

フォームデータ受け取りControllerの編集


まず先ほど作成したFormRequestが継承されるように、参照の記述を変更しましょう。

//変更前
use Illuminate\Http\Request;
//変更後
use App\Http\Requests\CreatePostRequest;


またフォームの送信内容を受け取るクラスについても、FormRequestが継承されるように変更します。

public function store(CreatePostRequest $request)
    {
…
}

Bladeテンプレートにエラーメッセージ挿入

フォーム送信時にバリデーションチェックに引っ掛かった場合は、送信前のページにリダイレクトされます。

その際Bladeテンプレートに以下を記述しておくことで、エラー文を表示することが可能となります。

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

バリデーションの追加設定

attributesのカスタム設定


attributesを日本語に訳すと”属性”になりますが、ここでは項目名という認識で大丈夫です。
validationメッセージを日本語化しただけでは、まだ項目名だけ英語で表示されます。

そこでattributesのカスタム設定を行うことで項目名の日本語化が可能になります。

\app\Http\Requests\CreatePostRequest.phpで以下のように入力項目の制限を施していたとします。
※セキュリティの観点から実際のパスワードはもっと長くなければなりませんが

 public function rules()
    {
        return [
            'Password' => 'required|integer|digits:4',
        ];
    }

※required=必須項目、integer=整数でなければならない、digits:4=数字4桁でなければならない。


次にresources\lang\ja\validation.phpを開き'attributes'でカスタムバリデーションを設定します。

'attributes' => [
        'Password' => 'パスワード',
    ],

これで例えば「Passwordは4桁で指定してください」が「パスワードは4桁で指定してください」となります。

エラーメッセージの変更


Laravelのエラーメッセージはデフォルトで英語しか用意されておりません。
※バリデーションの言語ファイルは\resources\langに格納されており、デフォルトで存在するのはenフォルダのみです。

ただし日本語化自体はgithubに上がっているコードで簡単に実現します。
Laravel 5.1 日本語バリデーションメッセージファイル · GitHub
↑上記リンクはLaravel5.1と書かれていますが7.xでも問題なく使用可能です。

手順としては
①\resources\lang\jaフォルダに(なければ作成)validation.phpファイルを作成。
②上記githubのリンクで入手したコードをコピペ
③config/app.phpを以下のように編集
(localeの値をen→jaに変更)

/*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'ja',

以上になります。お疲れ様でした!