web-dev-qa-db-ja.com

検証ルールrequired_ifと他の条件(Laravel 5.4)

ネストされた条件を持つ検証ルールで問題が発生しました。

class StoreRequest extends Request
{
        public function authorize(){
        return true;
        }

        public function rules(){
                return [
                    'type_id'     => 'required|integer',
                    'external_id' => 'required_if:type_id,==,3|integer',
                ];
        }
}

実際、私は次のことを実行します。-type_idが3に等しい場合にのみ、external_idをチェックします-それが整数かどうかをチェックします。

フォームを投稿するとき、type_idを3に選択するとルールが機能しますが、1や2などの別のtype_idを選択すると、検証がパスしません。

External_idは整数でなければなりません。

Null許容条件を追加しようとしましたが、required_ifが機能しなくなりました

何かアイデアはありましたか?

8
kesm0

ルールは、互いに独立した2つのチェックを実行します。 _external_id_!= 3の場合に_type_id_フィールドが必要ないからといって、整数チェックが無視されるわけではありません。

あなたが探しているのは 条件付きルール です。これにより、いつチェックを実行するかを細かく制御できます。 :

_$validator = Validator::make($data, [
    'type_id'   => 'required|integer'
]);

$validator->sometimes('external_id', 'required|integer', function($input) {
    return $input->type_id == 3;
});
_

フォーム検証を使用する場合、getValidatorInstance()メソッドをオーバーライドすることで、基礎となるバリデーターインスタンスにアクセスできます。

_class StoreRequest extends Request
{
        public function authorize(){
        return true;
        }

        public function rules(){
                return [
                    'type_id'     => 'required|integer'
                ];
        }

        protected function getValidatorInstance() {
            $validator = parent::getValidatorInstance();
            $validator->sometimes('external_id', 'required|integer', function($input) {
                return $input->type_id == 3;
            });
            return $validator;
        }
}
_
7
Graham

同じ問題に遭遇し、私にはうまくいくように見える次の答えを見つけました:

issue-using-required-if-validation-rule-in-form-b​​uilder

     return [
                'type_id'     => 'required|integer',
                'external_id' => 'required_if:type_id,==,3|nullable|integer',
            ];

私のための結果:

フィールドが設定されていない、タイプIDが3ではない-パス

フィールドにデータが入力されていません。ID3を入力してください-失敗-必須フィールド

フィールドが入力され、タイプID 3、非整数-整数ルールで失敗

フィールドにデータが入力され、ID 3、整数型-パス-すべて良好です。

注-ヌル可能ルールが入っていると思うLaravel 5.3

8
Nick A

これを試して、

  class StoreRequest extends Request
    {
            public function authorize(){
            return true;
            }

            public function rules(){
                    return [
                        'type_id'     => 'required|integer',
                        'external_id' => 'required_if:type_id|in:3|integer',
                    ];
            }
    }
1
ashanrupasinghe