Files
cursor/plans/phpdoc_规范收紧_f84cb482.plan.md
ray zhou 1bcb6120dd ok
2026-05-29 17:23:17 +08:00

133 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: PHPDoc 规范收紧
overview: 调整 [`php-clean-code.mdc`](/Users/ray/.cursor/rules/php-clean-code.mdc) 第 5 节 PHPDoc 规则:除纯 getter/setter 外Logic/Service/Model 的 public 方法一律必须写中文 PHPDoc删除「方法名够清晰可不写」的豁免并同步 Agent 自查清单。
todos:
- id: revise-section-5
content: 重写 php-clean-code.mdc §5默认必须、getter/setter 豁免、中文首行、删除旧豁免句
status: completed
- id: tighten-must-list
content: 将原「以下情况必须写」改为「附加要求」,避免被理解为可选项
status: completed
- id: update-agent-checklist
content: 更新 §8 Agent 自查:中文 PHPDoc 全覆盖检查项
status: completed
- id: verify-consistency
content: 通读 Model @property 小节与 §5确认无冲突表述
status: completed
isProject: false
---
# PHPDoc 规范收紧计划
## 背景
当前 [`php-clean-code.mdc`](/Users/ray/.cursor/rules/php-clean-code.mdc) 存在两条互相削弱的规则:
- 第 165 行:`Logic、Service、Model 的 public 方法**建议**写 PHPDoc`
- 第 167174 行:仅列举部分场景「**必须**写」
- 第 203 行:`简单 getter/setter、方法名和类型已足够清晰时**不强制** PHPDoc`
团队诉求:**除纯 getter/setter 外,其余方法都要写 PHPDoc且以中文说明业务含义**(很多人看不懂英文方法名)。这与已存在的 [Model 类 `@property` 规范](/Users/ray/.cursor/rules/php-clean-code.mdc)(约 123159 行)方向一致,需统一到同一套原则。
## 修改范围
**仅改规则文件**(不批量改历史代码):
- [`/Users/ray/.cursor/rules/php-clean-code.mdc`](/Users/ray/.cursor/rules/php-clean-code.mdc) — §5 PHPDoc 与注释、§8 Agent 自查
[`agent-completion-gate.mdc`](/Users/ray/.cursor/rules/agent-completion-gate.mdc) 仍引用「php-code PHPDoc 章节」,无需改路径;完成门禁时 Agent 按更新后的 §5 执行即可。
## §5 改写要点
### 1. 默认规则:从「建议」改为「必须」
将第 165 行改为明确默认值:
> **Logic / Service / Model 的 `public` 方法必须写 PHPDoc**(首行中文说明业务动作);`protected` 方法若承载业务步骤,同样必须。
### 2. 唯一豁免:纯 getter / setter
用白名单定义豁免,替代原第 203 行「方法名够清晰可不写」:
| 可豁免 | 不可豁免 |
|--------|----------|
| 无业务分支、无事务、无外部调用的 `getXxx()` / `setXxx()` | `findActiveBySessionId``createActiveSession``launchWithSession` 等 |
| 只读/写入单个属性或 DTO 字段 | 名称像 getter 但含查询、状态判断、写入库表 |
| | `isXxx()` / `hasXxx()` / `ensureXxx()` / `markXxx()` |
示例(写入规范正文):
```php
// 可豁免
public function getUid(): int { return $this->uid; }
// 不可豁免 — 必须中文 PHPDoc
public static function findActiveBySessionId(string $sessionId): ?self
```
### 3. 方法 PHPDoc 格式要求(中文优先)
规定最小合格格式(与现有 Model `@property` 风格一致):
```php
/**
* 按对外 session_id 查询未过期且有效的 Launch Session。
*
* @throws BusinessException 当 ...
*/
public static function findActiveBySessionId(string $sessionId): ?self
```
- **首行必须是中文**,说明「做什么 / 业务结果」,不能只重复英文方法名。
- 保留现有硬性要求:`array` 结构、`@throws`、状态流转等(作为**附加**要求,不是唯一触发条件)。
- **禁止废话**:禁止只写 `/** get user */``/** @param int $uid */` 而无中文业务说明;禁止与签名完全重复的英文复述。
### 4. 删除 / 替换第 203 行
删除:
> 不要写废话 PHPDoc。简单 getter/setter、方法名和类型已足够清晰时不强制 PHPDoc。
替换为两条并列原则:
- **禁止废话**:无信息增量、纯英文复述签名 → 不合格。
- **除纯 getter/setter 外一律必须**:英文命名不能替代中文 PHPDoc。
保留第 205 行「注释解释为什么,不解释做什么」——仅适用于**行内注释**;方法 PHPDoc 首行仍要写「做什么」(中文),复杂处再用行内注释写「为什么」。
### 5. 收紧原「以下情况必须写」列表
原列表(返回 array、状态流转等改为 **「以下情况除满足通用要求外,还须额外写明…」**,避免读者误以为「不在列表里就可以不写」。
结构示意:
```mermaid
flowchart TD
method[public方法] --> isGetter{纯getter/setter?}
isGetter -->|是| exempt[可省略PHPDoc]
isGetter -->|否| required[必须中文PHPDoc首行]
required --> extra{array或throws等?}
extra -->|是| addTags[补充结构或throws]
```
## §8 Agent 自查增补
在 §8 增加 / 调整检查项(约 245 行后):
- Logic / Service / Model 的 `public` 方法是否均有**中文** PHPDoc除纯 getter/setter
- 是否存在「只有 `@param`/`@return` 类型、无中文业务说明」的 PHPDoc
可将原「返回 array / 复杂数组 / throws」三条合并表述为「在通用要求之上是否满足附加结构」避免清单过长。
## 不纳入本次范围
- **不**批量给存量 PHP 文件补 PHPDoc体量大另开重构任务
- **不**强制 Controller / Validate / DTO 全量 PHPDoc当前 §5 范围是 Logic/Service/Model若需扩大可后续单独立项
- **不**新增 CI 自动检测脚本(可选后续:`scripts/check-phpdoc.sh`)。
## 验收
- `php-clean-code.mdc` §5 不再出现「方法名够清晰可不写 PHPDoc」。
- 新规则与 Model `@property` 小节无矛盾。
- Agent 自查清单覆盖「中文 PHPDoc + getter/setter 豁免」。