【问题标题】:Check existence of nested value in Laravel Form Request Validation检查 Laravel 表单请求验证中是否存在嵌套值
【发布时间】:2020-06-13 16:02:47
【问题描述】:

我有以下验证规则:

[
    MenuItem::MENU_ITEM_NAME        => 'required|unique:menu_items,name',
    MenuItem::MENU_ITEM_DESCRIPTION => 'nullable',
    MenuItem::MENU_ITEM_CATEGORY    => 'required|exists:categories,id',
    MenuItem::MENU_ITEM_SIDE        => 'nullable|boolean',
    MenuItem::MENU_ITEM_SIDE_ONLY   => 'nullable|boolean',
    MenuItem::MENU_ITEM_IMAGE       => 'nullable',
    MenuItem::MENU_ITEM_AVAILABLE   => 'nullable|boolean',
    MenuItem::MENU_ITEM_ACTIVE      => 'nullable|boolean',
    MenuItem::MENU_ITEM_PRICING     => 'required',
]

在我需要实施这个测试用例之前,它们都可以正常工作:

定价又名MenuItem::MENU_ITEM_PRICING 是一个数组数组。我需要检查当MenuItem::MENU_ITEM_SIDE 作为true 传递时,pricing 数组必须包含一个子数组,其中包含该特定项目的一些值。

例如:

[
    MenuItem::MENU_ITEM_SIDE => false,
    MenuItem::MENU_ITEM_PRICING => []
]

前面的例子是有效的。但是:

[
    MenuItem::MENU_ITEM_SIDE => true,
    MenuItem::MENU_ITEM_PRICING => []
]

无效,应该是:

[
    MenuItem::MENU_ITEM_SIDE => false,
    MenuItem::MENU_ITEM_PRICING => [['sideprice' => 2.20]]
]

我如何检查(在我的FormRequest 类中)如果MenuItem::MENU_ITEM_SIDE == true 那么MenuItem::MENU_ITEM_PRICING 应该包含一个带有名为sideprice 的键的子数组?

【问题讨论】:

    标签: php laravel laravel-6 laravel-validation laravel-formrequest


    【解决方案1】:

    您可以将after hooks 添加到您的表单请求中,只需像这样覆盖withValidator 方法:

    /**
     * Configure the validator instance.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @return void
     */
    public function withValidator($validator)
    {
        // Check using `sometimes` method
        $validator->sometimes("{MenuItem::MENU_ITEM_PRICING}.*.sideprice", 'required', function ($input) {
            return $input->${MenuItem::MENU_ITEM_SID};
        });
    
        // Or check using `after` method
        $validator->after(function ($validator) {
            if ($this->input(MenuItem::MENU_ITEM_SID, false)
                && ! \Illuminate\Support\Arr::has($this->input(MenuItem::MENU_ITEM_PRICING, []), '*.sideprice')) {
                $validator->errors()->add('field', 'Something is wrong with this field!');
            }
        });
    }
    

    注意:我尚未对此进行全面测试,但它为您提供了思路。

    【讨论】:

    • 这个想法绰绰有余!非常感谢
    猜你喜欢
    • 2022-01-11
    • 2023-02-02
    • 2018-06-15
    • 2016-09-02
    • 2021-06-02
    • 2016-05-23
    • 2016-03-11
    • 2015-06-09
    相关资源
    最近更新 更多