laravel 如何验证一个字段必须为真,如果另一个字段为假

pkbketx9  于 2023-06-24  发布在  其他
关注(0)|答案(6)|浏览(139)

下面是我目前验证的一个片段:

'independent_financial_advisor' => 'required|boolean',
'understand_objective' => 'required|boolean',
'confirm_objective' => 'required|boolean',
'understand_term_held' => 'required|boolean',
'tax_relief' => 'required|boolean',

我需要验证当independent_financial_advisor为false时,下面剩下的4个字段必须为true。我找不到任何Laravel规则可以做到这一点,所以我想使用闭包来创建一个自定义规则。
这样做的问题是,我不知道如何引用闭包中的另一个字段来检查其值。
最好的办法是什么?谢谢

ddrv8njm

ddrv8njm1#

我添加了一个名为true_if_reference_is_false的自定义验证规则,并向其传递了一个参数independent_financial_advisor
因此,验证看起来像这样:

$this->validate($request, [
    'independent_financial_advisor' => 'required|boolean',
    'understand_objective' => 'required|boolean|true_if_reference_is_false:independent_financial_advisor',
    'confirm_objective' => 'required|boolean|true_if_reference_is_false:independent_financial_advisor',
    'understand_term_held' => 'required|boolean|true_if_reference_is_false:independent_financial_advisor',
    'tax_relief' => 'required|boolean|true_if_reference_is_false:independent_financial_advisor'
]);

您需要在App\Providers\AppServiceProvider.php Import Facade Validator中定义此验证规则。

use Illuminate\Support\Facades\Validator;

然后在boot方法中定义规则:

Validator::extend('true_if_reference_is_false', function ($key, $value, $parameters, $validator) {
    $request = request();
    $keyReference = $parameters[0];
    if ($request->has($parameters[0]) && $request->$keyReference == false)
        return (bool)$request->$key;
    else
        return true;
});

希望这有帮助:)

u4dcyp6a

u4dcyp6a2#

'independent_financial_advisor' => 'required|boolean',
'understand_objective' => 'boolean|required_if:independent_financial_advisor,0,false',
'confirm_objective' => 'boolean|required_if:independent_financial_advisor,0,false',
'understand_term_held' => 'boolean|required_if:independent_financial_advisor,0,false',
'tax_relief' => 'boolean|required_if:independent_financial_advisor,0,false',

有关更多验证规则,请查看laravel文档www.example.com https://laravel.com/docs/5.7/validation#rule-required-if

krugob8w

krugob8w3#

$validator = Validator::make($request->all(), [
                'tax_relief'=>['required','in:true']
            ]);
if ($validator->fails()) {
                return response()->json($validator->errors());
}
3zwjbxry

3zwjbxry4#

使用Laravel 8,我通过以下方式解决了这个问题:

// MyFormRequest.php
public function rules()
{
    return [
        'bool_attrib_1' => [
            'required',
            'bool',
            function ($attribute, $value, $fail) {
                if (! $value && ! request('bool_attrib_2')) {
                    $fail('You must select either Bool Attrib 1 or Bool Attrib 2.');
                }
            },
        ],
        'bool_attrib_2' => [
            'required',
            'bool',
            function ($attribute, $value, $fail) {
                if (! $value && ! request('bool_attrib_1')) {
                    $fail('You must select either Bool Attrib 1 or Bool Attrib 2.');
                }
            },
        ],
    ];
}
ybzsozfc

ybzsozfc5#

我今天遇到了这个问题,并使用条件验证闭包解决了它(因为它在整个应用程序中只使用一次)。
基本上,用户必须根据需要标记phoneemail字段。它们可以都是true,也可以只有一个是true,但不能都是false
技巧是use闭包中的request对象,以访问需要作为验证检查一部分的其他字段。字段是array强制转换属性的一部分,这就是为什么它具有.的原因。

'required_order_fields.phone' => [
                Rule::in(["true", "false"]),
                function ($attribute, $value, $fail) use ($request) {
                    if ($value === "false" && $request->input('required_order_fields.email') === "false") {
                        $fail('The '.$attribute.' must be required if the email customer field is not required');
                    }
                },
            ],
            'required_order_fields.email' => [
                Rule::in(["true", "false"]),
                function ($attribute, $value, $fail) use ($request) {
                    if ($value === "false" && $request->input('required_order_fields.phone') === "false") {
                        $fail('The '.$attribute.' must be required if the phone customer field is not required');
                    }
                },
            ],
wljmcqd8

wljmcqd86#

Validator::extend('true_if_reference_is_false', function ($key, $value, $parameters, $validator) {
        $request = request();
        $keyReference = $parameters[0];
        if ($request->has($parameters[0]) && $request->$keyReference == false)
            return (bool)$request->$key;
        else
            return true;
    });

    Validator::extend('false_if_reference_is_true', function ($key, $value, $parameters, $validator) {
        $request = request();
        $keyReference = $parameters[0];
        if ($request->has($parameters[0]) && $request->$keyReference == true)
            return !(bool)$request->$key;
        else
            return true;
    });

相关问题