关于枚举

🛠️ 一、 完整定义:如何创建一个全能枚举类

为了展示所有功能,我们定义一个名为 TaskStatusEnum 的类。它不仅包含基本信息,还加入了 icon 等扩展属性。

namespace plugin\xbCode\enum;

use plugin\xbCode\base\BaseEnum;

/**
 * 任务状态枚举示例 📋
 */
class TaskStatusEnum extends BaseEnum
{
    // 💡 每一个常量都是一个包含元数据的数组
    const PENDING = [
        'label' => '待处理',
        'value' => '10',
        'style' => 'info', // 纯文本样式标识
        'icon'  => 'fa fa-clock-o', // 图标类名
        'color' => '#1890ff'
    ];

    const PROCESSING = [
        'label' => '进行中',
        'value' => '20',
        'style' => 'primary',
        'icon'  => 'fa fa-play',
        'color' => '#52c41a'
    ];

    const FINISHED = [
        'label' => '已完成',
        'value' => '30',
        'style' => 'success',
        'icon'  => 'fa fa-check',
        'color' => '#faad14'
    ];
}


🚀 二、 大检阅:BaseEnum 的各种姿势

BaseEnum 提供了非常多的内置方法,让我们来看看它们在 TaskStatusEnum 上的表现。

1. toArray():转换成数组 📦

用于需要遍历所有状态的场景。

$all = TaskStatusEnum::toArray();
/* 
输出结果:
[
  ['label' => '待处理', 'value' => '10', 'style' => 'info', 'icon' => '...', 'key' => 'PENDING'],
  ['label' => '进行中', 'value' => '20', 'style' => 'primary', 'icon' => '...', 'key' => 'PROCESSING'],
  ...
]
*/

2. getFieldValue():精准获取某个字段 🎯

用于已知 Value 获取对应的 Label 或 Style。

// 获取名称: 返回 "进行中"
$label = TaskStatusEnum::getFieldValue('20'); 

// 获取图标: 返回 "fa fa-check"
$icon = TaskStatusEnum::getFieldValue('30', 'fa-question', 'icon'); 

3. options():生成下拉菜单选项 🔽

直接喂给前端组件,格式完美契合。

$selectOptions = TaskStatusEnum::options();
// 返回: [['label' => '待处理', 'value' => '10'], ...]

4. dict():生成样式/值字典 📖

快速获取对应关系的映射数组。

// 获取状态与样式的对应关系
$styles = TaskStatusEnum::dict('style'); 
// 返回: ['10' => 'info', '20' => 'primary', '30' => 'success']

5. status():获取包含图标和标签的完整状态数据 🏷️

常用于列表页的格式化输出。

$statusData = TaskStatusEnum::status();
// 返回以 value 为键的完整对象数组,方便根据数据库的值直接查找


💼 三、 业务实战:在代码中如何优雅地使用

不要直接在代码里写 '10',那是魔鬼!请使用枚举:

1. 数据保存逻辑 ✅

public function updateTaskStatus($taskId) {
    $data = [
        'status' => TaskStatusEnum::PROCESSING['value'], // ✅ 使用枚举,语义清晰
        'update_time' => time()
    ];
    // ... 执行数据库更新 ...
}

2. 逻辑判断场景 ⚖️

if ($taskInfo['status'] === TaskStatusEnum::FINISHED['value']) {
    return "恭喜,任务已经结束了!🎉";
}

3. 前端界面渲染 🖥️

结合 getFieldValue 获取图标和样式。

// 在控制器传给视图
$statusValue = $task['status'];
$viewData = [
    'status_text' => TaskStatusEnum::getFieldValue($statusValue),
    'status_icon' => TaskStatusEnum::getFieldValue($statusValue, '', 'icon'),
    'status_color' => TaskStatusEnum::getFieldValue($statusValue, '#000', 'color'),
];

4. 高级技巧:Switch 开关配置 🔄

如果你的枚举是像 StateEnum 那样的二元状态,可以使用内置的 switch() 方法:

// 返回适配 Switch 组件的数据格式
$switchConfig = StateEnum::switch(); 
// 输出: ['onText' => '启用', 'offText' => '禁用', 'trueValue' => '20', 'falseValue' => '10']


🌈 总结:为什么它是开发者的好帮手?

  1. 所见即所得:代码里看到 TaskStatusEnum::FINISHED 就知道是在处理已完成状态。
  2. 维护零负担:要改颜色?改图标?改文案?只需要动一下枚举类,全项目自动更新!✨
  3. 多维度支持:不仅仅是 KV 键值对,更能承载样式、图标等 UI 属性,真正实现逻辑与展示的统一。

希望这份“全家桶”示例能让您彻底掌握枚举的使用精髓!💪🚀📚