Laravel表单请求自定义验证异常:非已删除SKU仍触发提示
问题根源分析
- 自定义规则逻辑完全倒置:Laravel验证规则中,
passes方法返回true代表验证通过(不触发提示),返回false才会触发错误提示。你当前的逻辑是"SKU存在且已软删时返回true(通过)",和需求完全相反。 - 表单请求规则语法错误:
'required' . $this->product?->id是无效写法,且缺少SKU唯一性校验(创建/编辑商品时SKU需唯一,编辑时排除当前商品)。 - 未查询软删除数据:默认情况下,使用
SoftDeletestrait的模型不会包含软删除数据,导致无法检测到已软删的SKU。
修改方案
1. 修正自定义验证规则
<?php namespace App\Rules; use Closure; use Illuminate\Contracts\Validation\Rule; use App\Models\Product; class SkuDeletedValidationRule implements Rule { public function passes($attribute, $value) { // 必须用withTrashed()才能查询到软删除的商品 $model = Product::withTrashed()->where('sku', $value)->first(); // 需求:仅当SKU存在且已软删时触发提示 → 这种情况返回false(验证失败) if ($model && $model->deleted_at !== null) { return false; } // 其他情况(SKU不存在/存在但未软删)都验证通过 return true; } public function message() { return 'The :attribute exists but has been deleted, please restore it.'; } }
2. 修正表单请求的SKU规则
// ProductRequest.php的rules方法中修改sku字段规则 public function rules(): array { return [ 'name' => 'required', 'sku' => [ 'required', new SkuDeletedValidationRule, // 添加正确的唯一校验,编辑时排除当前商品ID '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' ]; }
修改说明
- 反转
passes方法的返回逻辑,让"SKU存在且已软删"的场景触发验证失败 - 使用
withTrashed()确保能查询到软删除的商品,避免漏判 - 修复SKU规则的语法错误,补充必要的唯一性校验,符合商品创建/编辑的业务逻辑
内容的提问来源于stack exchange,提问作者Dava Eranda
相关产品推荐
相关产品推荐

