This commit is contained in:
ray zhou
2026-06-29 14:51:55 +08:00
parent 225fb2bd28
commit 2dd9f17da9
319 changed files with 29461 additions and 9412 deletions

View File

@@ -69,10 +69,11 @@ alwaysApply: true
- 方法参数一般不超过 3 个。
- 参数超过 3 个时,优先使用 DTO、Value Object 或专门数据结构。
- 核心业务入参不要直接使用含糊的 `array`。
- 返回 `array` 时必须结构明确,并用 PHPDoc 描述结构
- **Logic / Service 禁止返回 `array`**(含 `@return array{...}`、`@return XxxEntity[]`);固定形状业务结果必须返回 **Entity**(见 §4「返回值规则」
- Model 若返回 `array`,必须结构明确,并用 PHPDoc 描述结构。
- 私有方法也必须有清晰业务语义,并写中文 PHPDoc见 §5纯 getter/setter 除外)。
- 复杂条件必须封装成有语义的方法。
- 魔法数字必须变成常量或枚举。
- 魔法数字必须变成常量或枚举**所有类常量必须写中文注释**(见下文「常量规则」)
- 业务规则判断优先使用 `ensureXxx()` 方法。
- 不要把查询、判断、写入、返回组装全部堆在一个大方法里。
@@ -90,6 +91,35 @@ alwaysApply: true
- 聚合上下文 DTO 应 **只组合** 子对象;派生值用 `uid()` / `providerCode()` 等 accessor 从子对象读取,或在用例方法内直接使用子 DTO 字段(二选一,不并存)。
- 子步骤 private 方法若需多字段,优先传 **一个** 聚合 DTO而不是再拆 3 个标量参数。
### 常量规则
- 魔法数字、魔法字符串必须提为 `const` 或枚举,禁止硬编码在业务逻辑中。
- **所有类常量**`public` / `protected` / `private` const必须有一行 `/** 中文说明 */`**无豁免**。
- 注释须说明业务含义、取值语义或用途;禁止纯英文复述常量名(无信息增量 → 不合格)。
- Model 中状态类常量(`STATUS_*` 等)还须与 `@property status` 描述一致,列出各枚举值含义。
反例(禁止):
```php
class GameServerLogic extends BaseLogic
{
private const SOURCE_CODE_LENGTH = 6;
}
```
正例:
```php
class GameServerLogic extends BaseLogic
{
/** 渠道编号长度(位) */
private const SOURCE_CODE_LENGTH = 6;
/** Session 有效 */
public const STATUS_ACTIVE = 1;
}
```
---
## 4. Logic / Service / Model 写法
@@ -103,6 +133,7 @@ alwaysApply: true
- 复杂查询条件应沉淀到 Model。
- 涉及多表写入、钱包变动、订单状态变更、活动领取、返水领取、游戏下注 / 派奖时,事务边界必须放在 Logic。
- 事务内禁止请求第三方接口、发送 MQ、发送短信、发送邮件、大量循环处理、复杂远程调用。
- **Logic 禁止返回 `array`**;业务结果组装为 Entity 后返回,由 Controller 再转为 HTTP 响应(如 `activeData()`)。
### Service
@@ -111,6 +142,18 @@ alwaysApply: true
- Service 禁止只做 Model 转发或 Logic 转发。
- Service 禁止为每张表创建一个 Service。
- 如果一个 Service 方法没有封装公共能力,不应创建。
- **Service 禁止返回 `array`**;对外暴露的结构化结果同样使用 Entity。
### 返回值规则Logic / Service
- **禁止** Logic / Service 方法声明返回 `array`(含关联数组、索引数组、`array{...}` 形状数组)。
- **必须** 使用 `app/entity/{业务域}/XxxEntity`(优先 `extends app\entity\BaseEntity`)承载固定形状业务数据;命名表达业务语义,如 `GrantSettleResultEntity`、`WalletStatisticsEntity`。
- Entity 使用 **public 属性** + 中文属性注释;字段名与接口/库表约定一致(通常 camelCase`new XxxEntity([...])` 由 `BaseEntity` 填充。
- **多条记录**:禁止 `@return XxxEntity[]` 或裸 `array`;使用列表/汇总 Entity如 `PlayerTaskListEntity`),在 Entity 内用 `/** @var XxxEntity[] */ public array $items` 等**有命名语义**的属性承载Logic/Service 方法本身仍返回该 Entity 对象。
- **允许** 返回:`void`、标量(`bool` / `int` / `string` / `float`)、`?XxxEntity`(可空实体)、单个 Entity。
- **禁止** 直接返回 Model 对象Model 查询结果须在 Logic 内映射为 Entity 后再返回。
- Controller 负责把 Entity 转为统一 HTTP 响应;**禁止** 在 Controller 里拼装本应由 Logic 产出的业务结构数组。
- `verify-slot-backend.sh` 对 git diff **新增行** 自动拦截 Logic/Service 的 `: array`、`@return array{...}`、`@return Xxx[]`;历史存量方法改 body 不触发。确需临时豁免的文件可在类 PHPDoc 首段标注 `@logic-service-array-exempt`(仅迁移期,须注明原因)。
### Model
@@ -120,16 +163,18 @@ alwaysApply: true
- Model 方法命名必须表达查询或写入意图,例如 `findEnabledById()`、`existsClaimedRecord()`、`sumValidBetAmount()`、`createClaimRecord()`。
- 避免 `getData()`、`getList()`、`handle()`、`process()`。
#### Model 类 PHPDoc新建 / 大改必须)
#### Model 类 PHPDoc必须
**新建** 或 **大改** `app/model/**/*Model.php`(含 `app/**/model/` 下 Model类上必须有完整 PHPDoc**禁止** 只类型、不写字段说明。
凡 `app/model/**/*Model.php`(含 `app/**/model/` 下 Model类上**必须**有完整 PHPDoc**禁止**只有一行类说明、无 `@property`,或 `@property`类型无中文说明。
1. **类注释**`表名` + 一行业务说明(对齐 DDL `COMMENT` 或需求文档)。
2. **`@property`**:每个持久化字段一行,格式 `@property type $field 中文说明`(对齐表字段 `COMMENT`)。
2. **`@property`(必须)****每个持久化字段**一行,格式 `@property type $field 中文说明`(对齐表字段 `COMMENT`;缺字段、缺中文说明均不合格
3. **易混字段必须区分**:例如 `id`自增主键vs `session_id`对外标识vs `launch_request_id`(链路追踪)。
4. **状态字段**:写清「见 `STATUS_*` 常量」或列出枚举含义(与常量注释一致)。
5. **时间字段** `created_at` / `updated_at` 可简写为「创建时间」「更新时间」。
6. **状态类常量**`STATUS_*` 等):每个常量一行 `/** 中文说明 */`,与 `@property status` 描述一致
5. **时间字段** `created_at` / `updated_at` / `create_time` / `update_time` 可简写为「创建时间」「更新时间」。
6. **类常量**:遵守上文「常量规则」,每个 `const` 一行 `/** 中文说明 */`
**触达 Model 文件时**(新建、小改、补方法):若类 PHPDoc 缺 `@property` 或不完整,须在本次改动中补全,不得留空。
反例(禁止):
@@ -166,6 +211,8 @@ class GameLaunchSessionModel extends Model
**Logic / Service / Model 的 `public` / `protected` / `private` 方法必须写 PHPDoc**,首行用**中文**说明业务动作或结果(很多人看不懂英文方法名,英文命名不能替代 PHPDoc
**所有类常量**`public` / `protected` / `private` const必须有一行 `/** 中文说明 */`,见 §3「常量规则」**无豁免**。
- `public`:一律必须(纯 getter/setter 除外,见下文)。
- `protected` / `private`Logic 与 Service 中凡承载业务步骤的方法必须写Model 的 `private` 若仅为薄封装且无语义增量可省略,但 `find*` / `mark*` / 访问 DB/Redis 的 `private` 仍必须写。
@@ -212,16 +259,29 @@ public static function findActiveBySessionId(string $sessionId): ?self
除满足上文「默认规则」外,以下场景还须**额外**写明对应标签或结构(不在列表里也不能省略通用 PHPDoc
- 返回 `array`:必须用 `@return array{...}` 写清结构
- Logic / Service 返回 Entity`@return` 写具体 Entity 类名(如 `@return GrantSettleResultEntity`**禁止** `@return array{...}`。
- Model 返回 `array`:必须用 `@return array{...}` 写清结构Logic / Service 不适用)。
- 参数为复杂 `array`:必须用 `@param array{...} $name` 写清结构。
- 可能抛出业务异常:必须写 `@throws`(中文说明触发条件)。
- 涉及状态流转、钱包、订单、活动、游戏交易:首行中文说明中须点明状态/资金影响。
返回 array 结构示例:
Logic 返回 Entity 示例:
```php
/**
* 查询用户钱包汇总
* 执行直接发奖入账并返回账单结果
*
* @return GrantSettleResultEntity
* @throws BusinessException 钱包不可用或入账失败时
*/
public function grantSettle(GrantSettleDTO $grantSettleDto): GrantSettleResultEntity
```
Model 返回 array 结构示例(仅 Model 层):
```php
/**
* 查询用户钱包汇总原始行。
*
* @return array{
* user_id: int,
@@ -263,9 +323,10 @@ public static function findActiveBySessionId(string $sessionId): ?self
- 关键业务必须打日志,例如钱包变动、游戏下注、游戏派奖、支付回调、活动领取、返水领取、第三方接口异常、风控命中、重要状态变更。
- 日志必须包含关键上下文,例如 `user_id`、`order_no`、`provider_code`、`provider_tx_id`、`round_id`、`amount`、`status`、`error`。
- 日志禁止记录密码、token、secret、私钥、支付密钥、银行卡完整号码、用户隐私数据、第三方签名密钥。
- 返回结构必须明确。
- 返回结构必须明确Logic / Service 以 Entity 表达,不以裸 `array` 表达
- 不直接返回 Model 对象。
- 不返回临时调试字段、SQL、异常堆栈、内部配置、secret、token、sign。
- Controller 将 Entity 转为 HTTP 响应Logic / Service 不返回 HTTP Response。
---
@@ -284,22 +345,26 @@ public static function findActiveBySessionId(string $sessionId): ?self
- 命名是否清晰?
- 方法是否过长?
- 嵌套是否过深?
- 是否有魔法数字或魔法字符串?
- 是否有魔法数字或魔法字符串?是否已提为常量?
- **所有类常量是否均有中文注释**`/** 中文说明 */`
- Logic 是否表达清晰业务流程?
- Service 是否确实是公共能力?
- Model 是否只做数据访问?
- 新建/大改 Model 是否有类注释 + 带中文说明的 `@property`易混字段、status 是否写清)?
- `STATUS_*` 等状态常量是否有中文注释?
- **Model 类 PHPDoc 是否含完整 `@property`(每个持久化字段 + 中文说明)?触达 Model 时缺则须补全。**
- 所有 `const`(含 Logic / Service / Model 的 `private const`是否有中文注释?
- 多表写入是否有事务?
- 是否需要幂等?
- 是否吞异常?
- 日志是否有关键上下文?
- 是否泄露敏感信息?
- 返回数据是否明确?
- Logic / Service 是否**未返回 `array`**,且固定形状结果已用 Entity
- 列表/汇总场景是否用列表 Entity 包装,而非 `@return XxxEntity[]` 或裸数组?
- 是否直接返回 Model
- Logic / Service / Model 的 `public` / `protected` / `private` 方法是否均有**中文** PHPDoc 首行(纯 getter/setter 除外)?
- 是否存在只有 `@param`/`@return` 类型、无中文业务说明的 PHPDoc
- 返回 array / 复杂数组参数 / 抛异常的方法,是否在通用 PHPDoc 之上补全了 `array{...}` 结构与 `@throws`
- Model 返回 array / 复杂数组参数 / 抛异常的方法,是否在通用 PHPDoc 之上补全了 `array{...}` 结构与 `@throws`
- Logic / Service 返回 Entity 的方法,`@return` 是否为具体 Entity 类名?
- 是否存在「仅用于日志」的多余参数?
- 是否存在「局部变量 + 聚合 DTO」双份承载同一业务字段
- 聚合 DTO 是否包含可推导的重复标量?