0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel でのカスタムバリデーションルールのまとめ

Posted at

初めに

この記事は執筆時点での最新版である laravel8.x と LTS である laravel6.x を前提に記述しています。

前回作成したバリデーションの基本的な構文の記事でカスタムルールについて少し触れたので、今回は実際の記載方法を紹介したいと思います。

手法

カスタムバリデーションルールの実装方法は主に以下の 3 つとなる

  1. クロージャの使用
  2. Rule オブジェクトの使用
  3. Validator ファサードの拡張

1.クロージャの使用

用途:その場限定のルール
バージョン対応:laravel8.x, laravel6.x

構文

Validator::make($request->all(),
    [
        (パラメータ名) => [
            '(ルール1)',
            '(ルール2)',
            function ($attribute, $value, $fail) {
                if (判定したい条件式) {
                    $fail('エラーメッセージ');
                }
            },
        ],
    ],[]
)->validate();

引数の説明

$attribute:パラメータ名
$value:パラメータの値
$attribute:失敗時の処理(エラーメッセージの適用)

2.Rule オブジェクトの使用

用途:プロジェクト内で共有したいルール
バージョン対応:laravel8.x, laravel6.x

生成方法

以下のコマンドを実行

php artisan make:rule (クラス名)

生成先:app/Rules

クラスファイルの構文

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class SampleRule implements Rule
{
    public function passes($attribute, $value)
    {
        return (条件式);
    }

    public function message()
    {
        return '(エラーメッセージ)';
    }
}

関数の説明

passes:バリデーションが成功する条件式を返す関数
message:バリデーションエラーメッセージを返す関数

使用する際の構文

use App\Rules\SampleRule

(中略)

Validator::make($request->all(),
    [
        (パラメータ名) => [
            '(ルール1)',
            '(ルール2)',
            new SampleRule,
        ],
    ],[]
)->validate();

3.Validator ファサードの拡張

用途:プロジェクト内で共有したいルール
バージョン対応:laravel6.x

拡張方法

AppServiceProvider などのサービスプロバイダ内で登録

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class AppServiceProvider extends ServiceProvider
{
    (中略)

    public function boot()
    {
        Validator::extend(
            '(ルール名)',
            function ($attribute, $value, $parameters, $validator) {
                return (条件式);
            }
        );
    }
}

クロージャの引数の説明

$attribute:パラメータ名
$value:パラメータの値
$parameters:ルールに渡した引数((ルール名):foo,barfoo,bar
$validator:Validator インスタンス

エラーメッセージの設定

以下のどちらかの方法で指定
A:Validator::make()の第3引数のカスタムエラーメッセージ配列内で指定
B:バリデーション言語ファイルで指定

ルールクロージャの単一ファイル管理

config 等で

[(ルール名) => (クロージャ), ...]

という形でルールを集約し、拡張側の実装を

$rules = config('custom_rules');
foreach($rules as $key => $closure) {
    Validator::extend($key, $closure);
}

と実装することも可能

使い分け

手法 実装箇所 利点 欠点
クロージャ ルールの使用箇所 即席での実装 実装の散逸
Rule オブジェクト クラスファイル内 単一の実装箇所による変更の容易性 使用箇所でのインポート宣言が必要
Validator の拡張 サービスプロバイダ内 単一の実装箇所による変更の容易性
ルールクロージャの集約が可能
エラーメッセージの設定との分離
0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?