【问题标题】:Laravel custom rule pass array attributeLaravel 自定义规则传递数组属性
【发布时间】:2021-11-11 11:59:47
【问题描述】:

我有一个自定义规则,但不确定如何将一个数组属性传递给该规则。

以下是我的formRequest规则方法

'reservedProducts'             => ['bail', 'array'],
'reservedProducts.*.productId' => ['required',new CheckForStockAvailability()],

在名为reservedProducts[locationId] 的数组中传递了另一个隐藏字段,我如何将locationId 传递给CheckForStockAvailability 规则?

我不想传递所有请求属性,而只是传递locationId

谢谢

【问题讨论】:

  • 能否请您展示一个请求正文的示例?

标签: laravel


【解决方案1】:

例如,考虑以下规则,如果 payment_type 的值为 cc,则指定需要信用卡号:

Validator::make($request->all(), [
                'credit_card_number' => 'required_if:payment_type,cc' ]);

如果此验证规则失败,它将产生以下错误消息:

付款方式为抄送时,信用卡号字段为必填项。

除了将 cc 显示为支付类型值之外,您还可以通过定义 values 数组在 resources/lang/xx/validation.php 语言文件中指定更用户友好的值表示:

'values' => [
    'payment_type' => [
        'cc' => 'credit card'
    ],
],

定义此值后,验证规则会产生如下错误信息:

付款方式为信用卡时,信用卡号字段为必填项 卡。

【讨论】:

    【解决方案2】:

    在你的formRequest

        public function rules()
        {
            return [
                'reservedProducts' => [
                    'bail', 'array'
                ],
                'reservedProducts.*' => [
                    'required',
                    function($attribute, $value, $fail){
                        var_dump($value); // -> reservedProducts.0 {"productId":2} 
    
                        preg_match('/reservedProducts.(.*?) {/', $value, $match);
                        $locationId = (int)$match[1]; // -> 0
                    }
                ],
            ];
        }
    

    【讨论】:

    • 我还没有运行代码,但我猜$locationId 仍将与函数中的productId 相同。我想将表单中的隐藏字段locationId 传递给CheckForStockAvailability 规则。
    • @MikeRoss 抱歉我的粗心,应该是'reservedProducts.*' 而不是'reservedProducts.*'.productId
    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 2021-04-24
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2018-02-18
    相关资源
    最近更新 更多