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

如何编写验证规则以通过Larastan静态分析测试

解决Larastan验证规则中的属性访问报错

问题场景

当前验证规则代码:

public function rules(): array
{
    return [
        'name' => [
            'required',
            Rule::unique('domains', 'name')->where(function ($query) {
                return $query->where('organization_id', $this->route('organization')->id);
            })
        ]
    ];
}

Larastan报错:

Cannot access property $id on object|string|null.

解决方案

  • 方法1:利用路由模型绑定并添加类型断言
    若路由已使用路由模型绑定(即organization参数对应Organization模型),先获取实例并通过类型断言让Larastan明确其类型:

    use App\Models\Organization;
    
    public function rules(): array
    {
        /** @var Organization $organization */
        $organization = $this->route('organization');
    
        return [
            'name' => [
                'required',
                Rule::unique('domains', 'name')->where(function ($query) use ($organization) {
                    return $query->where('organization_id', $organization->id);
                })
            ]
        ];
    }
    
  • 方法2:添加存在性检查并处理null情况
    若organization可能不存在,先做存在性判断,避免空指针同时让Larastan识别类型:

    use App\Models\Organization;
    use Illuminate\Validation\Rule;
    
    public function rules(): array
    {
        $organization = $this->route('organization');
        
        // 若组织不存在,可抛出异常或返回对应规则
        if (!$organization instanceof Organization) {
            abort(404, '组织不存在');
        }
    
        return [
            'name' => [
                'required',
                Rule::unique('domains', 'name')->where(function ($query) use ($organization) {
                    return $query->where('organization_id', $organization->id);
                })
            ]
        ];
    }
    
  • 方法3:使用optional()辅助函数(不推荐,仅兼容场景)
    若业务允许organization为null,可通过optional()避免报错:

    public function rules(): array
    {
        return [
            'name' => [
                'required',
                Rule::unique('domains', 'name')->where(function ($query) {
                    return $query->where('organization_id', optional($this->route('organization'))->id);
                })
            ]
        ];
    }
    

    注意:此方法仅适用于organization_id允许为null的场景,优先推荐前两种方法保证类型安全。

内容的提问来源于stack exchange,提问作者Dom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:47:52