【Laravel】Validatorファサードで独自ルールの作り方!sometimesやextend
この記事からわかること
- Laravelのバリデーションとは?
- コントローラで使えるValidatorファサードのメソッド
- sometimesメソッドで条件次第でルールを追加
- extendメソッドで独自ルールをカスタマイズ
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelの値を検証できる機能、Validatorファサードでできる機能をまとめていきたいと思います。またこの記事は前回の続きです。使い方やメリットなどは以下記事を参考にしてください。
sometimesメソッド:条件分岐でルールを追加
参照記事:公式リファレンス-Validatorファサード:条件分岐-
Validatorファサードでは特定の条件の時のみルールを追加するといった動的なバリデーションが可能です。
条件を識別してルールを追加するにはValidatorファサードのsometimes
メソッドの引数に、条件に合致した場合に検証させたい項目名、ルール名、そしてその条件を渡します。
$validator->sometimes(項目名,ルール名,クロージャ(条件));
このメソッドを使えば「"年齢"が20以上の場合は"子供の人数"を必須にする」などといった入力値に対して動的にルールを変更させることが可能になります。
クロージャ(関数)には引数に$input
を受け取ることができここから入力値の値にアクセスすることができます。条件分岐は返す真偽値によって決定します。true
であれば追加で検証を実行してくれます。
クロージャ(条件)の中身
function ($input) {
return 真偽値;
};
実際の使用例
$validator->sometimes('child', 'required|max:5', function ($input) {
return $input->age >= 20;
});
実際の使用例(複数)
$validator->sometimes(['child', 'marriage'], 'required', function ($input) {
return $input->age >= 20;
});
おすすめ記事:【まとめ】Laravel-バリデーションルール一覧
extendメソッド:独自のルールを追加する
参照記事:公式リファレンス-Validatorファサード:独自ルールの拡張-
Validatorファサードではさらに独自のバリデーションルールを作成し検証させることも可能です。
作成するには静的メソッドであるextend
を使用します。引数に独自のルール名、ルールの関数を定義します。
Validator::extend(独自のルール名,クロージャ(ルール));
クロージャ(関数)には4つの引数を受け取ることができ、最終的に真偽値を返してバリデーションの結果を明示します。
クロージャ(ルール)の中身
function ($attribute, $value, $parameters, $validator) {
return 真偽値;
};
4つの引数でアクセスできる値
- $attribute:項目名(name属性)
- $value:入力値
- $parameters:ルールに渡される引数
- $validator:Validatorインスタンス
Validatorファサードで独自ルールを追加するには?
extendメソッド
は拡張してルールを追加できるメソッドですが、ではどこに記述すれば良いのでしょうか?
答えは「サービスプロバイダとして登録する」です。
サービスプロバイダの作成は専用のartisan
コマンドがあるので実行します。
$ php artisan make:provider ExtendValidatorServiceProvider
これで「app」>「Providers」ディレクトリ内に「ExtendValidatorServiceProvider.php(名前は自由)」が作成されました。
上部にValidatorファサードが使えるように読み込み文を追加します。
use Illuminate\Support\Facades\Validator
続いて自動実行されるboot
メソッドにextend
を使った独自ルールを定義していきます。今回は適当にルール名をhello
、ルールは入力値がhello
ならOKというルールにしておきます。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
// 追加
use Illuminate\Support\Facades\Validator;
class ExtendValidatorServiceProvider extends ServiceProvider
{
/**
* 全アプリケーションサービスの登録
*
* @return void
*/
public function register()
{
//
}
/**
* 全アプリケーションサービスの初期起動
*
* @return void
*/
public function boot()
{
Validator::extend('hello', function ($attribute, $value, $parameters, $validator) {
return $value == 'hello';
});
}
}
サービスプロバイダはこのままでは使用できませんので登録処理をしておきます。
config > app.php
'providers' => [
// 追加
App\Providers\ExtendValidatorServiceProvider::class,
],
登録するには「config」>「app.php」のproviders
配列に作成したサービスプロバイダを追加すればOKです。
これで独自ルールの追加が完了しました。あとは設定したルール名(今回はhello
)をルールとして記述するだけでオリジナルのバリデーションが可能です。
$validator = Validator::make($request->all(), [
'email' => 'required|email',
// 独自のルールを通常のルールに混じって使用できる
'title' => 'required|hello',
'body' => 'required',
]);
これではまだエラーメッセーがvalidation.hello
といった初期値で表示されてしまうのでエラーメッセージのカスタマイズもしておくことをおすすめします。
エラーメッセージのカスタマイズ方法はこちらの記事を参考にしてください。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。