如何在Laravel表单请求中获取数组字段当前索引的code值?
Laravel表单请求数组字段自定义验证规则获取当前索引值的解决方案
你遇到的问题是直接用$this->input('coupons.*.code')无法拿到当前循环索引对应的code值,因为这里的*是验证规则的通配符,Laravel不会将其替换为实际索引。下面是两种可行的解决方法:
方法一:修改自定义验证规则类,通过字段属性解析索引
自定义规则类可以通过验证时传入的$attribute参数(格式如coupons.0.code)解析出当前索引,再获取对应product_ids,而当前的code值就是验证方法的$value参数。
自定义规则类代码
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use Illuminate\Http\Request; class CheckCouponValidityForOrder implements Rule { protected $request; public function __construct(Request $request) { $this->request = $request; } public function passes($attribute, $value) { // 从字段属性中拆分出当前coupon的索引 $parts = explode('.', $attribute); $index = $parts[1]; // 获取当前索引对应的product_ids $productIds = $this->request->input("coupons.$index.product_ids"); // 这里编写你的实际验证逻辑 // 示例:检查优惠券code($value)是否适用于对应的productIds // return Coupon::validForProducts($value, $productIds)->exists(); return true; // 替换为实际验证结果 } public function message() { return '优惠券无效或不适用于所选商品'; } }
表单请求中的验证规则
[ 'coupons' => 'nullable|array|min:1', 'coupons.*.code' => [ 'required', 'string', new CheckCouponValidityForOrder($this) // 传入当前请求实例 ], // 添加上product_ids的基础验证,确保字段有效 'coupons.*.product_ids' => 'required|array|min:1|exists:products,id' ]
方法二:使用闭包验证规则(无需单独规则类)
如果不需要复用验证逻辑,可以直接在验证规则中使用闭包,同样通过解析$attribute获取索引:
[ 'coupons' => 'nullable|array|min:1', 'coupons.*.code' => [ 'required', 'string', function ($attribute, $value, $fail) { // 解析当前索引 $parts = explode('.', $attribute); $index = $parts[1]; $productIds = $this->input("coupons.$index.product_ids"); // 执行验证逻辑,不通过时调用$fail返回错误信息 if (!/* 你的验证条件 */) { $fail('优惠券无效或不适用于所选商品'); } } ], 'coupons.*.product_ids' => 'required|array|min:1|exists:products,id' ]
内容的提问来源于stack exchange,提问作者Md. A. A. Apu
相关产品推荐
相关产品推荐

