You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel表单请求自定义验证异常:非已删除SKU仍触发提示

问题根源分析

  1. 自定义规则逻辑完全倒置:Laravel验证规则中,passes方法返回true代表验证通过(不触发提示),返回false才会触发错误提示。你当前的逻辑是"SKU存在且已软删时返回true(通过)",和需求完全相反。
  2. 表单请求规则语法错误:'required' . $this->product?->id 是无效写法,且缺少SKU唯一性校验(创建/编辑商品时SKU需唯一,编辑时排除当前商品)。
  3. 未查询软删除数据:默认情况下,使用SoftDeletes trait的模型不会包含软删除数据,导致无法检测到已软删的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:30:31