如何修复Laravel Validated DTO类中未定义属性访问错误?
修复方案
1. 修正DTO类的结构
该包的DTO设计不需要手动声明public属性,字段通过rules方法定义验证规则,casts方法配置类型转换即可。确保你的DTO继承正确的基类并配置规则:
namespace App\DTO; use WendellAdriel\ValidatedDTO\ValidatedDTO; use WendellAdriel\ValidatedDTO\Casts\StringCast; class ItemsFilterDTO extends ValidatedDTO { protected function rules(): array { return [ 'sortBy' => 'nullable|string', ]; } protected function casts(): array { return [ 'sortBy' => new StringCast(), ]; } }
2. 添加PHPDoc让Larastan识别属性
由于该包通过魔术方法__get提供属性访问,Larastan默认无法自动识别这些动态属性。在DTO类上添加@property标签明确属性类型:
/** * @property ?string $sortBy */ class ItemsFilterDTO extends ValidatedDTO { // 规则与转换配置 }
3. 正确初始化DTO实例
在控制器中通过官方提供的方法创建DTO,确保字段被正确加载:
// 从请求初始化 $filtersDTO = ItemsFilterDTO::fromRequest($request); // 或从数组初始化 $filtersDTO = ItemsFilterDTO::fromArray(['sortBy' => $request->input('sortBy')]); // 正常访问属性 $sortByValue = $filtersDTO->sortBy;
4. 可选:优化Larastan全局配置
如果项目中有大量DTO,可在phpstan.neon中添加规则避免重复添加PHPDoc:
parameters: ignoreErrors: - '#Access to an undefined property WendellAdriel\\ValidatedDTO\\ValidatedDTO\$.*#'
注意:此方式会屏蔽所有ValidatedDTO的未定义属性错误,更推荐用PHPDoc标签的精准方式。
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

