Quantcast
Channel: laravel5.8タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 87

Laravelの追加バリデーションwithValidatorについて、rules()を通過した時のみ使用するようにする方法

$
0
0

どこに需要があるかわらないが、調べても出てこなかったので自分用に書きました。

今回の目的

rulesの部分でbail(1つの項目につき、1つのエラーを返すようにするoption)を使用しており、追加ルールを入れることによって、二つ目のエラーが追加されることを防ぎたい。

改善前のコード

例えば、以下のようなコードがあったとする。

//省略

public function rules()
{
  return[
    'id' => ['bail','required','integer']
  ];
}

public function withValidator($validator) {
  $validator->after(function ($validator) {

    $id = $this['id'];
    $DBidExists = Content::where('id', $id)
                         ->where('is_enabled', 1)
                         ->exists();
    if($DBidExists===false){
          $validator->errors()->add('id', 'idがDB上に存在しません');
    }    
  });
}

このコードではidに対して、前半で必須かつ数字であることをバリデートして、追加ルールで詳細なDB存在チェックを行っている。

しかし、このままだとidに何も入力しなかった時や数字以外の文字列を入力した時に、前半部分のエラーもreturnされてしまいbailが崩れてしまう。

解決策

$validator->after(function ($validator)に入る前に、if($validator->fails()) return;を追加する。

改善後のコード

//省略

public function rules()
{
  return[
    'id' => ['bail','required','integer']
  ];
}

public function withValidator($validator) {
  //これを追記した
  if($validator->fails()) return;

  $validator->after(function ($validator) {

    $id = $this['id'];
    $DBidExists = Content::where('id', $id)
                         ->where('is_enabled', 1)
                         ->exists();
    if($DBidExists===false){
          $validator->errors()->add('id', 'idがDB上に存在しません');
    }    
  });
}

これを追加することで、前半のバリデーションでエラーがあった場合に、returnされて、追加ルールのチェックをスキップすることができる。

注意

この方法が使えるのは、入力チェックする項目が一つの時のみです。また、afterで複数項目チェックする必要があるときは使えないので、あくまで簡易的なものとお考えください。


Viewing all articles
Browse latest Browse all 87

Trending Articles