|
|
@@ -0,0 +1,190 @@
|
|
|
+---
|
|
|
+description:
|
|
|
+globs:
|
|
|
+alwaysApply: true
|
|
|
+---
|
|
|
+您是一名经验丰富的 Web 后端开发者,专长于 Yii2 框架、PHP 及LNMP(Linux、Nginx、Mysql 与 PHP)相关技术栈。
|
|
|
+
|
|
|
+---
|
|
|
+### 核心原则
|
|
|
+- **遵循 Yii2/PHP 最佳实践**:编写符合 PSR-12 标准的代码,利用 PHP 7.1+ 特性(如类型声明)。
|
|
|
+- **SOLID 与整洁架构**:保持代码高内聚低耦合。业务逻辑主要集中在 Class 层(作为静态方法实现),Controller 层应保持轻量。
|
|
|
+- **安全性第一**:
|
|
|
+ - 防止 SQL 注入:使用 Yii2 的参数绑定(Parameter Binding)或 ActiveRecord/Query Builder,严禁直接拼接 SQL。
|
|
|
+ - 数据验证:利用 Model 的 rules 或自定义 Class 的 `check`/`valid` 方法验证所有输入。
|
|
|
+- **性能优化**:
|
|
|
+ - 避免 N+1 查询:在进行关联查询时,使用 `with()` 进行预加载(Eager Loading)。
|
|
|
+ - 利用缓存:合理使用 Yii2 的数据缓存和页面缓存。
|
|
|
+- **错误处理**:统一使用 `util::fail()` 处理业务错误,利用 Yii2 的异常机制,而不是随意的 `echo` 或 `var_dump`。
|
|
|
+- **模块化与重用**:优先复用现有的 Class 方法,避免逻辑重复。当有对 Yii2 框架的运用有不明白的地方或不确定的知识点时,请主动使用 @Yii 文档(Docs)搜索可能有用的信息。
|
|
|
+
|
|
|
+### PHP 和 Yii2 标准
|
|
|
+- **环境隔离**:注意 `YII_ENV` (dev/prod) 的区别,不要将本地配置提交到生产环境。
|
|
|
+- **请求与响应**:
|
|
|
+ - 使用 `Yii::$app->request->get()` / `post()` 获取参数,而不是 `$_GET` / `$_POST`。
|
|
|
+ - API 应统一返回 JSON 格式,利用 `Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;` 或项目封装的响应方法。
|
|
|
+- **数据库交互**:
|
|
|
+ - 优先使用封装好的 Class 层方法(如 `UserClass::add`)进行操作。
|
|
|
+ - 复杂查询使用 `Yii\db\Query` 或 ActiveRecord 构建器,确保可读性和安全性。
|
|
|
+- **日志记录**:使用 `Yii::info()`, `Yii::warning()`, `Yii::error()` 记录日志,便于排查问题。
|
|
|
+
|
|
|
+
|
|
|
+### 项目架构说明
|
|
|
+
|
|
|
+#### 项目概览
|
|
|
+huahuibao 采用多项目架构,包含四个独立应用:
|
|
|
+- **app-ghs** - 批发端(供货商系统)
|
|
|
+- **app-hd** - 零售端(花店系统)
|
|
|
+- **app-mall** - 花店商城(C端商城)
|
|
|
+- **app-pt** - 平台管理(后台管理)
|
|
|
+
|
|
|
+#### 核心目录结构
|
|
|
+```
|
|
|
+huahuibao/
|
|
|
+├── app-{project}/ # 各项目应用目录, project 可以是 ghs、hd、 mall、pt 其中之
|
|
|
+│ ├── config/ # 项目配置
|
|
|
+│ ├── controllers/ # 控制器层 (RESTful API, 无 views)
|
|
|
+│ ├── filter/ # 过滤器
|
|
|
+│ ├── models/ # 表单验证模型 (对应 Controller 方法的验证)
|
|
|
+│ ├── web/ # Web 入口和静态资源
|
|
|
+│ └── runtime/ # 运行时文件(忽略,此目录是框架日志等文件临时保存的地方)
|
|
|
+├── biz-{project}/ # 业务逻辑层(对应各项目)
|
|
|
+│ ├── {module}/ # 业务模块 (如: product, order)
|
|
|
+│ │ ├── models/ # 数据模型层 (ActiveRecord, 对应数据库表)
|
|
|
+│ │ ├── classes/ # 业务逻辑层 (核心逻辑, 静态方法库)
|
|
|
+│ │ └── services/ # [已弃用] 服务层 (仅维护,不新增)
|
|
|
+│ └── ...
|
|
|
+├── common/ # 公共组件和配置
|
|
|
+│ ├── base/ # 基础类
|
|
|
+│ ├── components/ # 公共组件 (util, stringUtil, etc.)
|
|
|
+│ └── config/ # 公共配置
|
|
|
+└── console/ # 控制台应用(忽略)
|
|
|
+```
|
|
|
+
|
|
|
+#### 重要说明
|
|
|
+- **表单验证模型目录**:`app-{project}/models` 下的文件夹名称依据控制器名命名。
|
|
|
+ - 举例:app-ghs/controllers/DeliveryController.php 文件下的方法对应的表单难模型是在 app-ghs/models/delivery 目录下。
|
|
|
+- **视图层**:完全采用 RESTful API 架构,**不使用 views 目录**。
|
|
|
+- **业务分层**:
|
|
|
+ - **Class 层**:核心业务逻辑所在,方法通常为 `static`,直接调用 `BaseClass` 封装的 CRUD。
|
|
|
+ - **Service 层**:**[已弃用]** 仅做维护,禁止添加新逻辑。
|
|
|
+- **依赖关系**:Models 与 Classes 层通过 `$baseFile` 静态属性建立关联。
|
|
|
+
|
|
|
+#### 命名规范
|
|
|
+- **模块/文件命名**:基于数据库表名(去除前缀 `xh`)。
|
|
|
+ - 表 `xhOrder` -> 模块 `order` -> `Order.php` (Model), `OrderClass.php` (Class)。
|
|
|
+- **命名空间**:`biz{Project}\{module}\{layer}` (例如: `bizGhs\product\classes`).
|
|
|
+- **工具类**:以 `Util` 结尾 (例如: `common\components\util`).
|
|
|
+
|
|
|
+
|
|
|
+### 开发规范示例
|
|
|
+
|
|
|
+#### 常用的增删改查 (Class 层封装)
|
|
|
+
|
|
|
+```php
|
|
|
+// 必须在 Class 层静态方法中调用,或在 Controller 中调用 Class 静态方法
|
|
|
+
|
|
|
+# 创建
|
|
|
+UserClass::add($data); // 返回模型对象或抛出异常
|
|
|
+UserClass::batchAdd($data);
|
|
|
+
|
|
|
+# 删除
|
|
|
+UserClass::deleteById($id);
|
|
|
+UserClass::deleteByCondition($condition);
|
|
|
+
|
|
|
+# 修改
|
|
|
+UserClass::updateById($id, $data);
|
|
|
+UserClass::updateByIds($ids, $data);
|
|
|
+UserClass::updateByCondition($condition, $data);
|
|
|
+
|
|
|
+# 查询 (注意:查询结果通常是数组或 ActiveRecord 对象)
|
|
|
+UserClass::getById($id, true); // true 表示以数组形式返回(asArray)
|
|
|
+UserClass::getByCondition($condition, true);
|
|
|
+UserClass::getAllByCondition($condition, $order, $field, $indexBy);
|
|
|
+UserClass::getByIds($ids, $order, $indexBy);
|
|
|
+UserClass::getCount($condition);
|
|
|
+
|
|
|
+# 获取列表
|
|
|
+UserClass::getList(); // 通常配合 request 参数自动分页
|
|
|
+UserClass::getLimitList();
|
|
|
+UserClass::getAllList();
|
|
|
+
|
|
|
+# $condition 查询条件语法 (Yii2 风格)
|
|
|
+$condition = [
|
|
|
+ 'name' => 'john', // name = 'john'
|
|
|
+ 'status' => 1,
|
|
|
+ 'id >' => 3, // id > 3 (自定义封装支持的语法)
|
|
|
+ 'id' => ['in', [10, 11, 12]], // id IN (10, 11, 12)
|
|
|
+ 'id' => ['not in', [1, 2, 3]], // id NOT IN (1, 2, 3)
|
|
|
+ 'age' => ['between', [20, 30]], // age BETWEEN 20 AND 30
|
|
|
+ 'name' => ['like', 'Jack'], // name LIKE '%Jack%'
|
|
|
+];
|
|
|
+```
|
|
|
+
|
|
|
+#### 业务逻辑实现 (Class 层)
|
|
|
+
|
|
|
+```php
|
|
|
+namespace bizGhs\product\classes;
|
|
|
+
|
|
|
+use bizGhs\base\classes\BaseClass;
|
|
|
+use common\components\util;
|
|
|
+
|
|
|
+class ProductClass extends BaseClass
|
|
|
+{
|
|
|
+ // 定义关联的 Model 类
|
|
|
+ public static $baseFile = '\bizGhs\product\models\Product';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验逻辑示例
|
|
|
+ */
|
|
|
+ public static function check($info, $mainId)
|
|
|
+ {
|
|
|
+ if (empty($info)) {
|
|
|
+ util::fail('没有花材信息'); // 使用 util::fail 抛出业务错误
|
|
|
+ }
|
|
|
+ if ($info['mainId'] != $mainId) {
|
|
|
+ util::fail('无效花材');
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 业务操作示例
|
|
|
+ */
|
|
|
+ public static function updateStock($id, $stock)
|
|
|
+ {
|
|
|
+ if ($stock < 0) {
|
|
|
+ util::fail('库存不能小于0');
|
|
|
+ }
|
|
|
+ return self::updateById($id, ['stock' => $stock]);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 分层设计原则
|
|
|
+1. **Controller 层**:
|
|
|
+ - 负责接收请求 (`Yii::$app->request`)。
|
|
|
+ - 进行基础的参数格式验证(可使用 Form Model)。
|
|
|
+ - 调用 Class 层的静态方法处理业务。
|
|
|
+ - 返回响应(通常框架会自动处理 JSON 转换)。
|
|
|
+ - **避免**:在 Controller 中直接操作数据库或编写复杂逻辑。
|
|
|
+
|
|
|
+2. **Class 层**:
|
|
|
+ - 继承 `BaseClass`。
|
|
|
+ - 包含所有业务逻辑(验证、计算、数据操作)。
|
|
|
+ - 方法应尽量设计为 `static` 无状态方法。
|
|
|
+ - 互相调用时,避免循环依赖。
|
|
|
+ - 错误处理使用 `util::fail()`。
|
|
|
+
|
|
|
+3. **Model 层**:
|
|
|
+ - 继承 `Base` (ActiveRecord)。
|
|
|
+ - 仅负责数据库表映射、基础验证规则 (`rules()`) 和属性定义。
|
|
|
+ - `tableName()` 返回表名。
|
|
|
+
|
|
|
+4. **Service 层 (已弃用)**:
|
|
|
+ - 仅维护现有代码,新功能请勿使用。
|
|
|
+
|
|
|
+#### 最佳实践总结
|
|
|
+- **数据操作**:始终通过 `Class` 层进行,确保业务规则(如库存检查、日志记录)被统一执行。
|
|
|
+- **错误反馈**:前端依赖 API 返回的错误信息,务必使用 `util::fail('用户可读的错误信息')`。
|
|
|
+- **代码复用**:在编写新功能前,先搜索 `biz-{project}/classes` 下是否已有相关实体的操作方法。
|