任务时间: 2025年05月26日 18:46
任务类型: Bug修复
涉及模块: Pet, Farm
Pet/GetHandler出现错误:
The validator [App\Module\Pet\Validators\PetGetValidator] don't exists!
通过分析错误日志和代码,发现问题出现在Validation类中使用自定义Validator的方式不正确。
在PetGetValidation和FertilizerValidation中,我使用了类名字符串的方式:
// 错误的方式
[
'item_id', PetGetValidator::class, 'args' => ['user_id'],
'msg' => '宠物获取验证失败'
]
通过查看其他工作的Validation类(如CropPlantValidation、CropHarvestValidation等),发现正确的使用方式是实例化Validator对象:
// 正确的方式
[
'item_id', new PetGetValidator($this, ['user_id']),
'msg' => '宠物获取验证失败'
]
验证框架(inhere/php-validate)在处理自定义Validator时,期望的是:
当使用ValidatorClass::class时,框架无法识别这是一个自定义Validator类,导致抛出"don't exists"错误。
文件: app/Module/Pet/Validations/PetGetValidation.php
修复前:
[
'item_id', PetGetValidator::class, 'args' => ['user_id'],
'msg' => '宠物获取验证失败'
]
修复后:
[
'item_id', new PetGetValidator($this, ['user_id']),
'msg' => '宠物获取验证失败'
]
文件: app/Module/Farm/Validations/FertilizerValidation.php
修复前:
[
'land_id', LandOwnershipValidator::class, 'args' => ['user_id', 'land'],
'msg' => '土地不存在或不属于当前用户'
],
[
'item_id', ItemOwnershipValidator::class, 'args' => ['user_id', 'instance_id', 'quantity'],
'msg' => '您没有该肥料物品'
],
[
'item_id', FertilizerItemValidator::class, 'args' => ['fertilizer_item', 'crop_growth_time'],
'msg' => '该物品不是有效的肥料'
],
[
'land_id', FertilizerUsageValidator::class, 'args' => ['land', 'crop'],
'msg' => '当前土地状态或作物生长阶段不允许使用肥料'
]
修复后:
[
'land_id', new LandOwnershipValidator($this, ['user_id', 'land']),
'msg' => '土地不存在或不属于当前用户'
],
[
'item_id', new ItemOwnershipValidator($this, ['user_id', 'instance_id', 'quantity']),
'msg' => '您没有该肥料物品'
],
[
'item_id', new FertilizerItemValidator($this, ['fertilizer_item', 'crop_growth_time']),
'msg' => '该物品不是有效的肥料'
],
[
'land_id', new FertilizerUsageValidator($this, ['land', 'crop']),
'msg' => '当前土地状态或作物生长阶段不允许使用肥料'
]
自定义Validator继承自UCore\Validator,其构造函数签名为:
public function __construct(public ValidationCore $validation, public array $args = [], public $message = '')
参数说明:
$validation: 验证对象实例,用于设置验证结果和错误信息$args: 参数数组,传递给Validator的配置参数$message: 可选的错误消息验证框架在处理验证规则时:
new ValidatorClass($this, $args)$args参数传递配置$this->addError()添加错误信息$this->validation->$property = $value设置验证结果本次修复解决了Validator使用方式不正确导致的运行时错误。通过将类名字符串改为实例化对象,确保了验证框架能够正确识别和调用自定义Validator。
这个问题提醒我们在使用第三方验证框架时,需要严格按照框架的API规范来使用,避免因为使用方式不当导致的运行时错误。
修复后,Pet/GetHandler和FertilizerHandler的验证逻辑都能正常工作,提高了系统的稳定性和可靠性。