symfony7下Enum使用from创建一个Enum对象
if (!empty(array_intersect($userRoles, $allowedRoles))) {
$actionEnum = SubmissionActionEnum::from($actionValue);
$actionsData[] = new Dto\Query\Submission\Dashboard\SubmissionActionDto(
$actionEnum->name,
$actionEnum->value
);
}
代码分析
这段 Symfony 7 中的 PHP 代码逻辑如下:
✅ 作用总结:
判断当前用户角色是否包含在允许的角色中,如果是,则将某个 enum 类型的 action 组装成一个 SubmissionActionDto 对象,并添加到 $actionsData 数组中。
🔍 逐行分析:
if (!empty(array_intersect($userRoles, $allowedRoles))) {
array_intersect($userRoles, $allowedRoles)取出$userRoles和$allowedRoles中共同存在的角色。!empty(...)如果两者有交集(即用户具有至少一个允许的角色),才执行下面的代码。
$actionEnum = SubmissionActionEnum::from($actionValue);
SubmissionActionEnum::from($actionValue)使用 PHP 8.1+ 的 Backed Enums 功能,从$actionValue(应该是枚举的值,比如字符串或整数)生成一个SubmissionActionEnum枚举对象。- 这个方法在无法匹配时会抛出
ValueError。
$actionsData[] = new Dto\Query\Submission\Dashboard\SubmissionActionDto(
$actionEnum->name,
$actionEnum->value
);
创建一个新的
SubmissionActionDto实例,传入:$actionEnum->name:枚举的名称(如SendReminder)$actionEnum->value:枚举的值(如"send_reminder")
最后把这个 DTO 加入
$actionsData数组中,供后续处理(比如返回前端、渲染列表等)。
📌 示例:
假设:
$userRoles = ['ROLE_ADMIN'];
$allowedRoles = ['ROLE_ADMIN', 'ROLE_MANAGER'];
$actionValue = 'send_reminder';
enum SubmissionActionEnum: string {
case SendReminder = 'send_reminder';
case Archive = 'archive';
}
则:
array_intersect($userRoles, $allowedRoles)为['ROLE_ADMIN'],非空SubmissionActionEnum::from('send_reminder')返回枚举对象SubmissionActionEnum::SendReminder- 创建一个 DTO:
new SubmissionActionDto('SendReminder', 'send_reminder')
✅ 总结:
该段代码是典型的“权限判断后,执行特定操作并封装数据”逻辑:
- 权限检查: 用户是否有权进行某个动作
- 动作转换: 将字符串
$actionValue转换为枚举 - 数据封装: 使用 DTO 封装并保存结果
