如何编写验证规则以通过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
相关产品推荐
相关产品推荐

