LoginSignup
1
2

More than 5 years have passed since last update.

Laravelでカスタムバリデータを作ってみた

Last updated at Posted at 2018-10-10

※前提: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."

よし、できた。

1
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
1
2