其他
用现代 PHP(8.3+)严格类型与…
在 PHP 8.3+ 项目(Laravel/Symfony)中实现带严格类型、静态分析达标、测试覆盖充分的 REST/GraphQL API 功能时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
用现代 PHP(8.3+)严格类型与 L通用
解决思路
- 先分析架构:确认所用框架、PHP 版本、依赖与既有代码模式,再动手写代码。
- 设计领域模型:创建带类型的实体(entity)、值对象(value object)和 DTO。
- 实现代码:编写严格类型代码,遵循 PSR 规范,使用依赖注入(DI)与仓储(repository)模式。
- 安全加固:加入输入校验、认证,以及 XSS 与 SQL 注入防护。
- 验证:运行 `vendor/bin/phpstan analyse --level=9` 并修复全部错误;再运行 `vendor/bin/phpunit` 或 `vendor/bin/pest` 并强制覆盖率 80%+;两者都干净通过后才交付。
- 按上下文加载参考文档:现代 PHP 特性读 `references/modern-php-features.md`;Laravel 读 `references/laravel-patterns.md`;Symfony 读 `references/symfony-patterns.md`;异步 PHP 读 `references/async-patterns.md`;测试与质量读 `references/testing-quality.md`。
- 每个文件顶部声明 `declare(strict_types=1)`。
- 为所有属性、参数、返回值都加类型提示。
- 遵循 PSR-12 编码规范。
- 交付前运行 PHPStan level 9。
- 在适用处使用 readonly 属性。
- 为复杂逻辑编写 PHPDoc 块。
- 用带类型的 request 校验所有用户输入。
- 使用依赖注入,而不是全局状态。
- 禁止省略类型声明(不允许 mixed 类型)。
- 禁止明文存储密码,必须使用 bcrypt/argon2。
- 禁止写出可被 SQL 注入的查询。
- 禁止把业务逻辑混进 controller。
- 禁止硬编码配置,改用 .env。
- 禁止在未运行测试与静态分析的情况下部署。
- 禁止在生产代码中使用 var_dump。
- 每个完整实现至少交付三件套:一个带类型的实体/DTO、一个 service 类、一个测试。
- DTO 用 `final readonly class`,并在构造函数中提升公开属性,提供 `public static function fromArray(array $data): self` 静态工厂方法。
- Service 用 `final class`,通过构造函数注入 `private readonly` 依赖,密码用 `Hash::make()` 哈希后再写入仓储。
- 测试用 PHPUnit `final class XxxTest extends TestCase`,在 `setUp()` 中用 `createMock()` 构造 mock 与被测服务,用 `expects($this->once())->method(...)->willReturn(...)` 断言交互,用 `assertSame` 断言结果。
- 枚举使用 PHP 8.1+ 的 backed enum(如 `enum UserStatus: string`),并用 `match($this)` 提供 `label()` 等方法。
- 按固定顺序交付功能:① 领域模型(实体/值对象/枚举)② service/repository 类 ③ controller/API 端点 ④ 测试文件(PHPUnit/Pest)⑤ 简要架构决策说明。
- 在以下技术栈范围内实现:PHP 8.3+、Laravel 11、Symfony 7、Composer、PHPStan、Psalm、PHPUnit、Pest、Eloquent ORM、Doctrine、PSR 标准、Swoole、ReactPHP、Redis、MySQL/PostgreSQL、REST/GraphQL API。
适用边界 · 注意事项
- 不适用于非 PHP 项目,或 PHP 版本低于 8.3、无法使用 readonly/fibers/enum 等新特性的旧代码库。
- 业务本身没有异步/高并发需求时,不必强行引入 Swoole 或 ReactPHP。
- 项目尚未配置 PHPStan/PHPUnit 时,level 9 与 80% 覆盖率门槛对小脚本或一次性原型过重,需先搭好工具链再套用。