※前提:ValidatorServiceProviderはArtisanコマンドから作成済みであること
今回の目的
「AとBの値は同時には指定できない」というバリデーションをかけたい
カスタムバリデートの作成
と、言っても、Bの部分は複数指定できることを想定しています。
なので、引数次第では「AとBとCの値は同時に指定できない」です。
ValidatorServiceProvider.php
// 使い方:exclude:hoge
Validator::extend('exclude', function ($attribute, $value, $parameters, $validator) {
// リクエスト内容を取得
$request = $validator->getData();
// $parametersの中には「hoge」が配列形式で入っている
foreach ($parameters as $key => $val) {
// キーさえ存在を許したくないので、array_key_existsを使う
if (array_key_exists($val, $request)) {
return false;
}
}
return true;
});
実際にValidatorとして使う場合
Validata.php
public function getRules(): array
{
return [
'fuga' => ['exclude:hoge'],
'hoge' => ['exclude:fuga']
];
}
Validatorの書き方がわからなくて何時間も悩んでしまい、仕舞には人に聞くというポンコツぶりを発揮した件でした。
エラーメッセージもカスタマイズする
ちなみに、メッセージもカスタムしたいですよね。
理想はこちら
You can be specified only one of hoge or fuga.
これもValidatorServiceProviderに書けばできます。
ValidatorServiceProvider.php
// $message='You can be specified only one of :attribute or :param.'
Validator::replacer('exclude', function ($message, $attribute, $rule, $parameters) {
// $parametersは配列なので文字列に変換する
return str_replace(':param', implode('or',$parameters), $message);
});
Validata.php
public function getMessages(): array
{
return [
'exclude' => 'You can be specified only one of :attribute or :param.'
];
}
出力されたメッセージ
"You can be specified only one of hoge or fuga."
よし、できた。