系统日志中出现枚举对象无法转换为字符串的错误:
[2025-06-26T18:13:08.366101+08:00] laravel.ERROR: Object of class App\Module\Farm\Enums\GROWTH_STAGE could not be converted to string {"exception":"[object] (Error(code: 0): Object of class App\\Module\\Farm\\Enums\\GROWTH_STAGE could not be converted to string at /www/wwwroot/farm-api.urausii.top/kku_laravel/app/Module/Farm/Commands/UpdateCropGrowthCommand.php:65)"} []
通过代码检查发现多个问题:
UpdateCropGrowthCommand.php 第65行,枚举对象被直接用于字符串插值->value() 方法调用,但PHP枚举的 value 是属性而非方法文件: app/Module/Farm/Commands/UpdateCropGrowthCommand.php
修复前:
$this->info("作物 ID: {$crop->id}, 用户 ID: {$userId}, 阶段: {$oldStage} -> {$crop->growth_stage}");
修复后:
// 获取阶段名称用于显示
$oldStageName = GROWTH_STAGE::getName($oldStage->value);
$newStageName = GROWTH_STAGE::getName($crop->growth_stage->value);
$this->info("作物 ID: {$crop->id}, 用户 ID: {$userId}, 阶段: {$oldStageName} -> {$newStageName}");
文件: app/Module/Farm/Commands/FixCropFinalOutputCommand.php
修复前:
GROWTH_STAGE::getName($crop->growth_stage->value()),
修复后:
GROWTH_STAGE::getName($crop->growth_stage->value),
文件: app/Module/Farm/Dtos/CropInfoDto.php
修复前:
$dto->growthStage = $crop->growth_stage->value();
修复后:
$dto->growthStage = $crop->growth_stage->value;
文件: UCore/DcatAdmin/ShowHelper.php
修复前:
if($value instanceof \BackedEnum){
$value = $value->value();
}
修复后:
if($value instanceof \BackedEnum){
$value = $value->value;
}
文件: UCore/DcatAdmin/GridHelper.php
修复前:
if ($value instanceof \UnitEnum) {
$value = $value->value();
}
修复后:
if ($value instanceof \UnitEnum) {
$value = $value->value;
}
# 测试作物生长状态更新命令
php artisan farm:update-crop-growth
# 输出:开始更新作物生长状态...找到 0 个需要更新的作物,成功更新 0 个作物的生长状态
# 测试作物修复命令
php artisan farm:fix-crop-final-output --dry-run
# 输出:执行干运行模式,只显示需要修复的数据...找到 0 个需要修复的作物,没有需要修复的作物
$enum->value 而不是 $enum->value()getName() 获取人类可读名称git add .
git commit -m "修复农场模块枚举对象字符串转换错误
问题描述:
- UpdateCropGrowthCommand中GROWTH_STAGE枚举对象在字符串插值时无法转换为字符串
- 多个地方使用了错误的->value()方法调用,应该使用->value属性
修复内容:
1. UpdateCropGrowthCommand.php: 修复枚举对象在字符串插值中的使用,使用getName()方法获取可读名称
2. FixCropFinalOutputCommand.php: 修复->value()方法调用为->value属性访问
3. CropInfoDto.php: 修复->value()方法调用为->value属性访问
4. UCore/DcatAdmin/ShowHelper.php: 修复BackedEnum的->value()方法调用
5. UCore/DcatAdmin/GridHelper.php: 修复UnitEnum的->value()方法调用
技术要点:
- PHP枚举的value是属性而非方法,不能使用括号调用
- 枚举对象在字符串上下文中需要显式转换
- 使用枚举的getName()静态方法获取人类可读的名称"