どこに需要があるかわらないが、調べても出てこなかったので自分用に書きました。
今回の目的
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で複数項目チェックする必要があるときは使えないので、あくまで簡易的なものとお考えください。