Laravelでバリデーションのルール(Rule)を追加する!

Laravel Laravel

Laravelのバリデーションで、独自のルールを設定する方法について書いています。
artisanコマンドでRuleファイルを作成することで、独自にバリデーションする項目に設定できます。
今回はLaravelのバージョン6で、挙動を確かめてみました。

独自のルールですが、例えば郵便番号のバリデーション(ハイフン付き)などをしたい場合に、Laravelにはこのルールが用意されていません。
この場合はRuleインターフェースを実装した、ZipCodeRuleというルールを作って下記のように指定すると良いです。

$request->validate([
    'zip_code'        => ['required', new ZipCodeRule()]
]);

それでは、実際にルールを作成する方法を見ていきましょう。

独自のRule(ルール)ファイルを作成する

下記のようにartisanコマンドのmake:ruleを使用することによりファイルを作成できます。

$ php artisan make:rule [ルールファイルの名前]

今回は実際にZipCodeRuleを作ってみました。

$ php artisan make:rule ZipCodeRule

作成されたRule(ルール)ファイルの確認

Rule(ルール)ファイルはapp/Rule/ディレクトリ配下に作成されます。
ファイルを開くと初期では、下記のような状態になっています。(コメントは省略しています)

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ZipCodeRule implements Rule
{
    public function __construct()
    {
        //
    }

    public function passes($attribute, $value)
    {
        //
    }

    public function message()
    {
        return 'The validation error message.';
    }
}

作成したRule(ルール)ファイルを修正する

passesメソッドに返り値がboolean(true / false)になるようにバリデーションを書きます。
messageメソッドはエラーだった場合のメッセージを書きます。

実際に郵便番号のルールを作ると、下記のような感じになりました。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ZipCodeRule implements Rule
{
    public function __construct()
    {
    }

    public function passes($attribute, $value)
    {
        return preg_match('/\A\d{3}[-]\d{4}\z/', $value);
    }

    public function message()
    {
        return '郵便番号が正しくありません。';
    }
}

解説

passesメソッドにルールを書きました。
preg_matchで郵便番号の000-0000の形式にあっていた場合はtrueが返ります。(違う場合はfalse)

$value変数にはバリデーションで指定した項目の値が入ってきます。
$attribute変数にはフォームタグのnameで指定した属性が入ってきます。(name=”zip_code”の場合は”zip_code”が入っています)
基本的には$valueの方しか使わないかと思います。

messageメソッドには、エラー時のメッセージを記載しました。

今回は直接書きましたが、実際にプロジェクトで使用する場合はLangファサードを使うなどした方が良いです。
メッセージファイルにまとめておくことができます。

作成した独自のRule(ルール)を使用する

前回作ったフォームに郵便番号の項目を作成して、バリデーションしてみました。

ZipCodeRuleを使うためにuse文で、App\Rulesの名前空間を指定します。
実際にコントローラーで書いたコードは下記のようになります。

<?php

namespace App\Http\Controllers;

use App\Rules\ZipCodeRule;
use Illuminate\Http\Request;

class TestController extends Controller
{
    public function index()
    {
        return view('test');
    }

    public function testAction(Request $request)
    {
        $request->validate([
            'user_name' => 'required',
            'age' => 'required|integer|min:0',
            'zip_code' => ['required', new ZipCodeRule()],
        ]);
    }
}

解説

作成したApp\Rules\ZipCodeRuleuse文で指定します。

validateの左側はフォームの項目で、右側がルールでした。
独自で作成したルールはこのようにnewして指定するといいです。

動作確認

下記のようにバリデーションにかかるように、郵便番号にハイフンを入れずに入力してみました。
Laravelの独自ルールを使った動作確認

エラーメッセージが表示されることが確認できました!(エラーがない場合も処理が通ることも確認しました)
Laravelの独自ルールを使った動作確認結果

終わりに

Laravelに用意されているルール以外でも、バリデーションしたいことも良く出てきます。
今回のようにRuleクラスを作ると簡単にできるので、使っていきましょう。

コメント

タイトルとURLをコピーしました