初めに
この記事は執筆時点での最新版である laravel8.x と LTS である laravel6.x を前提に記述しています。
前回作成したバリデーションの基本的な構文の記事でカスタムルールについて少し触れたので、今回は実際の記載方法を紹介したいと思います。
手法
カスタムバリデーションルールの実装方法は主に以下の 3 つとなる
- クロージャの使用
- Rule オブジェクトの使用
- 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,bar
のfoo,bar
)
$validator
:Validator インスタンス
エラーメッセージの設定
以下のどちらかの方法で指定
A:Validator::make()
の第3引数のカスタムエラーメッセージ配列内で指定
B:バリデーション言語ファイルで指定
ルールクロージャの単一ファイル管理
config 等で
[(ルール名) => (クロージャ), ...]
という形でルールを集約し、拡張側の実装を
$rules = config('custom_rules');
foreach($rules as $key => $closure) {
Validator::extend($key, $closure);
}
と実装することも可能
使い分け
手法 | 実装箇所 | 利点 | 欠点 |
---|---|---|---|
クロージャ | ルールの使用箇所 | 即席での実装 | 実装の散逸 |
Rule オブジェクト | クラスファイル内 | 単一の実装箇所による変更の容易性 | 使用箇所でのインポート宣言が必要 |
Validator の拡張 | サービスプロバイダ内 | 単一の実装箇所による変更の容易性 ルールクロージャの集約が可能 |
エラーメッセージの設定との分離 |