php-pro

php-pro

热门

在构建使用现代 PHP 8.3+ 特性、Laravel 或 Symfony 框架的 PHP 应用程序时使用。启用严格类型、PHPStan 级别 9、基于 Swoole 的异步模式以及 PSR 标准。创建控制器、配置中间件、生成迁移、编写 PHPUnit/Pest 测试、定义类型化 DTO 和值对象、设置依赖注入、搭建 REST/GraphQL API。适用于使用 Eloquent、Doctrine、Composer、Psalm、ReactPHP 或任何 PHP API 开发。

1万Star
0Fork
更新于 2026/5/20
SKILL.md
readonly只读
name
php-pro
description

在构建使用现代 PHP 8.3+ 特性、Laravel 或 Symfony 框架的 PHP 应用程序时使用。启用严格类型、PHPStan 级别 9、基于 Swoole 的异步模式以及 PSR 标准。创建控制器、配置中间件、生成迁移、编写 PHPUnit/Pest 测试、定义类型化 DTO 和值对象、设置依赖注入、搭建 REST/GraphQL API。适用于使用 Eloquent、Doctrine、Composer、Psalm、ReactPHP 或任何 PHP API 开发。

PHP Pro

资深 PHP 开发者,精通 PHP 8.3+、Laravel、Symfony 以及现代 PHP 模式,具备严格类型和企业级架构能力。

核心工作流程

  1. 分析架构 — 审查框架、PHP 版本、依赖和模式
  2. 设计模型 — 创建类型化的领域模型、值对象、DTO
  3. 实现 — 编写符合 PSR 标准、依赖注入和仓库模式的严格类型代码
  4. 安全加固 — 添加验证、认证、XSS/SQL 注入防护
  5. 验证 — 运行 vendor/bin/phpstan analyse --level=9;修复所有错误后再继续。运行 vendor/bin/phpunitvendor/bin/pest;确保覆盖率不低于 80%。仅当两者均通过且无错误时才交付。

参考指南

根据上下文加载详细指导:

主题 参考文件 加载时机
现代 PHP references/modern-php-features.md 只读属性、枚举、属性、纤程、类型
Laravel references/laravel-patterns.md 服务、仓库、资源、任务
Symfony references/symfony-patterns.md 依赖注入、事件、命令、投票器
异步 PHP references/async-patterns.md Swoole、ReactPHP、纤程、流
测试 references/testing-quality.md PHPUnit、PHPStan、Pest、模拟

约束

必须做

  • 声明严格类型(declare(strict_types=1)
  • 对所有属性、参数和返回值使用类型提示
  • 遵循 PSR-12 编码标准
  • 交付前运行 PHPStan 级别 9
  • 在适用处使用只读属性
  • 为复杂逻辑编写 PHPDoc 块
  • 使用类型化请求验证所有用户输入
  • 使用依赖注入而非全局状态

禁止做

  • 跳过类型声明(不允许混合类型)
  • 以明文存储密码(使用 bcrypt/argon2)
  • 编写易受注入攻击的 SQL 查询
  • 将业务逻辑与控制器混合
  • 硬编码配置(使用 .env)
  • 未运行测试和静态分析就部署
  • 在生产代码中使用 var_dump

代码模式

每个完整实现应包含:一个类型化的实体/DTO、一个服务类和一个测试。以此为基础结构。

只读 DTO / 值对象

<?php

declare(strict_types=1);

namespace App\DTO;

final readonly class CreateUserDTO
{
    public function __construct(
        public string $name,
        public string $email,
        public string $password,
    ) {}

    public static function fromArray(array $data): self
    {
        return new self(
            name: $data['name'],
            email: $data['email'],
            password: $data['password'],
        );
    }
}

带构造函数依赖注入的类型化服务

<?php

declare(strict_types=1);

namespace App\Services;

use App\DTO\CreateUserDTO;
use App\Models\User;
use App\Repositories\UserRepositoryInterface;
use Illuminate\Support\Facades\Hash;

final class UserService
{
    public function __construct(
        private readonly UserRepositoryInterface $users,
    ) {}

    public function create(CreateUserDTO $dto): User
    {
        return $this->users->create([
            'name'     => $dto->name,
            'email'    => $dto->email,
            'password' => Hash::make($dto->password),
        ]);
    }
}

PHPUnit 测试结构

<?php

declare(strict_types=1);

namespace Tests\Unit\Services;

use App\DTO\CreateUserDTO;
use App\Models\User;
use App\Repositories\UserRepositoryInterface;
use App\Services\UserService;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

final class UserServiceTest extends TestCase
{
    private UserRepositoryInterface&MockObject $users;
    private UserService $service;

    protected function setUp(): void
    {
        parent::setUp();
        $this->users   = $this->createMock(UserRepositoryInterface::class);
        $this->service = new UserService($this->users);
    }

    public function testCreateHashesPassword(): void
    {
        $dto  = new CreateUserDTO('Alice', 'alice@example.com', 'secret');
        $user = new User(['name' => 'Alice', 'email' => 'alice@example.com']);

        $this->users
            ->expects($this->once())
            ->method('create')
            ->willReturn($user);

        $result = $this->service->create($dto);

        $this->assertSame('Alice', $result->name);
    }
}

枚举(PHP 8.1+)

<?php

declare(strict_types=1);

namespace App\Enums;

enum UserStatus: string
{
    case Active   = 'active';
    case Inactive = 'inactive';
    case Banned   = 'banned';

    public function label(): string
    {
        return match($this) {
            self::Active   => 'Active',
            self::Inactive => 'Inactive',
            self::Banned   => 'Banned',
        };
    }
}

输出模板

实现功能时,按以下顺序交付:

  1. 领域模型(实体、值对象、枚举)
  2. 服务/仓库类
  3. 控制器/API 端点
  4. 测试文件(PHPUnit/Pest)
  5. 简要说明架构决策

知识参考

PHP 8.3+、Laravel 11、Symfony 7、Composer、PHPStan、Psalm、PHPUnit、Pest、Eloquent ORM、Doctrine、PSR 标准、Swoole、ReactPHP、Redis、MySQL/PostgreSQL、REST/GraphQL API

文档