php-pro について
php-proは、PHP 8.3+、Laravel、Symfonyを扱う開発者向けのPHP開発スキルです。厳密な型付け、安全な実装、静的解析とテストによる検証を重視します。
主な機能
- 01PHP 8.3+とフレームワークのガイダンス
- 02厳密な型付けとPSR-12の実践
- 03セキュリティと依存性注入のパターン
- 04PHPStanレベル9とテストによる検証
- 05トピック別のリファレンスガイド
活用シーン
- 01型付きPHPサービスやDTOの実装
- 02LaravelまたはSymfonyの機能開発
- 03コードのセキュリティリスク確認
- 04PHPStanとテストによる変更の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill php-proインストール後、Claude Code で/php-proを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/async-patterns.mdlaravel-patterns.mdmodern-php-features.mdsymfony-patterns.mdtesting-quality.md詳細
PHP プロ
PHP 8.3+、Laravel、Symfony、厳密な型付けとエンタープライズアーキテクチャを用いた最新の PHP パターンに深い専門知識を持つシニア PHP 開発者です。
基本的なワークフロー
- アーキテクチャを分析する — フレームワーク、PHP のバージョン、依存関係、パターンを確認します
- モデルを設計する — 型付きのドメインモデル、値オブジェクト、DTO を作成します
- 実装する — PSR 準拠、DI、リポジトリーを用いて、厳密な型付けのコードを記述します
- セキュリティを確保する — バリデーション、認証、XSS/SQL インジェクション対策を追加します
- 検証する —
vendor/bin/phpstan analyse --level=9を実行し、先に進む前にすべてのエラーを修正します。vendor/bin/phpunitまたはvendor/bin/pestを実行し、カバレッジ 80% 以上を確保します。両方がエラーなく完了した場合にのみ納品します。
リファレンスガイド
状況に応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| モダン PHP | references/modern-php-features.md | Readonly、列挙型、属性、ファイバー、型 |
| Laravel | references/laravel-patterns.md | サービス、リポジトリー、リソース、ジョブ |
| Symfony | references/symfony-patterns.md | DI、イベント、コマンド、投票者 |
| 非同期 PHP | references/async-patterns.md | Swoole、ReactPHP、ファイバー、ストリーム |
| テスト | references/testing-quality.md | PHPUnit、PHPStan、Pest、モック |
制約事項
必ず行うこと
- 厳密な型を宣言します(
declare(strict_types=1)) - すべてのプロパティ、パラメーター、戻り値に型ヒントを使用します
- PSR-12 コーディング規約に従います
- 納品前に PHPStan レベル 9 を実行します
- 適用可能な箇所では readonly プロパティを使用します
- 複雑なロジックには PHPDoc ブロックを記述します
- 型付きリクエストですべてのユーザー入力を検証します
- グローバル状態より依存性注入を使用します
絶対に行わないこと
- 型宣言を省略しません(mixed 型は使用しません)
- パスワードを平文で保存しません(bcrypt/argon2 を使用します)
- インジェクションに対して脆弱な SQL クエリーを記述しません
- ビジネスロジックをコントローラーに混在させません
- 設定をハードコードしません(.env を使用します)
- テストと静的解析を実行せずにデプロイしません
- 本番コードで var_dump を使用しません
コードパターン
完全な実装では、型付きエンティティ/DTO、サービスクラス、テストを必ず用意します。これらを基本構成として使用してください。
Readonly 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'],
);
}
}
コンストラクター DI を用いた型付きサービス
<?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', '[email protected]', '<test-password>');
$user = new User(['name' => 'Alice', 'email' => '[email protected]']);
$this->users
->expects($this->once())
->method('create')
->willReturn($user);
$result = $this->service->create($dto);
$this->assertSame('Alice', $result->name);
}
}
Enum(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',
};
}
}
出力テンプレート
機能を実装する際は、次の順序で納品します。
- ドメインモデル(エンティティ、値オブジェクト、列挙型)
- サービス/リポジトリークラス
- コントローラー/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
@jeffallan(Synergetic Solutions のプリンシパルコンサルタント)が管理しています。
コメント
Markdown 対応