Laravel表单请求自定义验证问题:已删除SKU校验失效
解决软删除产品SKU验证规则不生效及提示文案问题
问题梳理
需要为带软删除的products表SKU字段添加验证:当提交的SKU已存在且对应deleted_at不为空(即已被软删除)时,返回中文提示「该SKU已创建,请恢复已删除数据」,但当前自定义验证规则未生效,且提示仍为英文。
错误分析
- 验证逻辑倒置:自定义规则的
passes方法返回true代表验证通过,但当前逻辑是「SKU存在且已被软删除时验证通过」,与需求的「该场景下验证失败并提示」完全相反。 - 表单请求规则语法错误:
sku字段的规则数组未正确包含unique规则,导致规则解析异常。 - 提示文案未替换:规则的
message方法仍返回英文,未改为需求的中文提示。
修复步骤
1. 修正自定义验证规则类
调整逻辑,当SKU存在且已被软删除时,passes方法返回false(触发验证失败),同时替换提示文案:
namespace App\Rules; use Closure; use Illuminate\Contracts\Validation\Rule; use App\Models\Product; class SkuDeletedValidationRule implements Rule { public function passes($attribute, $value) { // 当SKU存在且deleted_at不为空(已被软删除)时,验证失败 return !\DB::table('products') ->where('sku', $value) ->whereNotNull('deleted_at') ->exists(); } public function message() { return '该SKU已创建,请恢复已删除数据'; } }
2. 修正表单请求的SKU规则
将unique规则正确放入sku的规则数组中,避免语法错误:
public function rules(): array { return [ 'name' => 'required', 'sku' => [ 'required', new SkuDeletedValidationRule, 'unique:products,sku,' . $this->product?->id ], 'sku_merchant' => 'nullable|unique:products,sku_merchant,' . $this->product?->id, 'slug' => 'nullable', 'is_publish' => 'required', 'price' => 'required', 'description' => 'required', 'discount' => 'nullable', 'images.*' => 'required', 'category.*' => 'nullable|exists:categories,id', 'supplier_id' => 'required', 'buyer_price' => 'required' ]; }
额外说明
如果你的需求是「仅允许使用已被软删除的SKU」(即SKU不存在或未被删除时验证失败),则passes方法无需取反,保持原逻辑即可,但此时提示文案需对应调整为「该SKU未被删除或不存在」,根据实际业务场景选择。
内容的提问来源于stack exchange,提问作者Dava Eranda
相关产品推荐
相关产品推荐

