mcpField
S
solid-php

solid-php

github.com/fusengine開発34103 回インストール2 週間前に更新
リポジトリ

solid-php について

solid-php は、Laravel 13 と PHP 8.3 以降のプロジェクト向けにコーディング指針を示すスキルです。Laravel と FuseCore のモジュール構成を判別し、配置ルールやアンチパターン検出、SOLID と DRY に基づくリファクタリングを案内します。

主な機能

  1. 01Laravel と FuseCore の構成を判別
  2. 02責務に応じたファイル配置の案内
  3. 03行数と PHPDoc の規約
  4. 04重複や一般的なアンチパターンの検出
  5. 05SOLID に基づくリファクタリング指針

活用シーン

  1. 01Laravel 13 の機能に適した構成の選択
  2. 02FuseCore モジュール内のインターフェースやサービスの配置
  3. 03大きなクラスやモデル内の業務ロジックの整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fusengine/agents --skill solid-php

インストール後、Claude Code で/solid-phpを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
anti-patterns.md
decision-guide.md
dependency-inversion.md
fusecore-structure.md
interface-segregation.md
laravel12-structure.md
liskov-substitution.md
open-closed.md
php85-features.md
single-responsibility.md
solid-principles.md
references/templates/
code-templates.md
controller-templates.md
refactoring-guide.md

詳細

Laravel 13 + PHP 8.3+ のコードに SOLID 原則と DRY を適用します。ファイルは 100 行未満(90 行で分割)、インターフェースは FuseCore/[Module]/App/Contracts/(共有のものは FuseCore/Core/App/Contracts/)に分離し、 すべての public メソッドに PHPDoc を必須とします。Laravel か FuseCore モジュラーアーキテクチャかを自動検出し、それに応じてコードの配置を振り分けます (Controllers/Requests/Actions/Services/Repositories/DTOs/Contracts/Events/ Policies)。アンチパターン検出(肥大化したクラス、モデル内のビジネスロジック、具象依存、 strict_types の欠落)と、SOLID 原則(SRP/OCP/LSP/ISP/DIP)ごとのリファクタリング ガイダンスも提供します。

SOLID PHP - Laravel 13 + PHP 8.3

エージェントワークフロー(必須)

いかなる実装の前にも、3 つのエージェントを並列で起動してください。それぞれ name を指定した Agent 呼び出し 1 回ずつです。

  1. fuse-ai-pilot:explore-codebase - 既存のアーキテクチャを分析
  2. fuse-ai-pilot:research-expert - Context7 経由で Laravel/PHP のドキュメントを検証
  3. mcp__context7__query-docs - SOLID パターンを確認

実装後は、検証のために fuse-ai-pilot:sniper を実行してください。


DRY - 作成する前に再利用(必須)

新しいコードを書く前に:

  1. 類似するクラス名、メソッド、ロジックがないかコードベースを grep する
  2. 共有の場所を確認する: FuseCore/Core/App/Services/、FuseCore/Core/App/Traits/、FuseCore/[Module]/App/Contracts/
  3. 類似のコードが存在する場合 → 重複させずに拡張/再利用する
  4. 2 つ以上の機能で使われるコードの場合 → 共有の Services または Traits に作成する
  5. 繰り返されるロジック(3 回以上の出現)を共有ヘルパーまたは Traits に抽出する
  6. 記述後に重複が発生していないことを確認する

自動検出(モジュラー必須)

検出されるファイルアーキテクチャインターフェースの場所
FuseCore/ ディレクトリFuseCore モジュラーFuseCore/[Module]/App/Contracts/
モジュール内の module.jsonFuseCore モジュラーFuseCore/[Module]/App/Contracts/

確認: php artisan --version → Laravel 13.x 構造: 常に FuseCore モジュラー。共有は FuseCore/Core/App/ に配置します。


決定木: コードをどこに置くか?(FuseCore モジュラー)

New code needed?
├── HTTP validation → FuseCore/[Module]/App/Http/Requests/
├── Single action → FuseCore/[Module]/App/Actions/
├── Business logic → FuseCore/[Module]/App/Services/
├── Data access → FuseCore/[Module]/App/Repositories/
├── Data transfer → FuseCore/[Module]/App/DTOs/
├── Interface → FuseCore/[Module]/App/Contracts/
├── Event → FuseCore/[Module]/App/Events/
└── Authorization → FuseCore/[Module]/App/Policies/

決定木: どのパターンを使うか?

必要性パターン場所最大行数
HTTP 処理ControllerControllers/50
バリデーションFormRequestRequests/50
単一の操作ActionActions/50
複雑なロジックServiceServices/100
データアクセスRepositoryRepositories/100
データ構造DTODTOs/50
抽象化InterfaceContracts/30

重要なルール(必須)

1. ファイルは 100 行未満
  • 90 行で分割 - 100 行を超えないこと
  • Controllers は 50 行未満
  • Models は 80 行未満(リレーションを除く)
  • Services は 100 行未満
2. インターフェースの分離(FuseCore モジュラー必須)
FuseCore/[Module]/App/Contracts/   # Module interfaces ONLY
├── UserRepositoryInterface.php
└── PaymentGatewayInterface.php
FuseCore/Core/App/Contracts/       # Shared interfaces
3. PHPDoc 必須
/**
 * Create a new user from DTO.
 *
 * @param CreateUserDTO $dto User data transfer object
 * @return User Created user model
 * @throws ValidationException If email already exists
 */
public function create(CreateUserDTO $dto): User

リファレンスガイド

概念
トピックリファレンス参照すべきタイミング
SOLID の概要solid-principles.mdすべての原則のクイックリファレンス
SRPsingle-responsibility.mdファイルが長すぎる、ファットなコントローラー/モデル
OCPopen-closed.md支払い方法やチャネルの追加
LSPliskov-substitution.mdインターフェースの契約、プロバイダーの差し替え
ISPinterface-segregation.mdファットなインターフェース、未使用のメソッド
DIPdependency-inversion.md密結合、テスト、モック
アンチパターンanti-patterns.mdコードスメルの検出
意思決定decision-guide.mdパターンの選択
PHP 8.5php85-features.mdモダンな PHP の機能
構造laravel12-structure.md標準的な Laravel
FuseCorefusecore-structure.mdモジュラーアーキテクチャ
テンプレート
テンプレート使用するタイミング
code-templates.mdService、DTO、Repository、Interface
controller-templates.mdController、Action、FormRequest、Policy
refactoring-guide.mdレガシーコードからの段階的な移行

禁止事項

アンチパターン検出方法修正方法
100 行を超えるファイル行数より小さなファイルに分割する
50 行を超えるコントローラー行数Service に抽出する
実装ファイル内のインターフェース配置場所FuseCore/[Module]/App/Contracts/ に移動する
モデル内のビジネスロジックモデル内のコードService に抽出する
具象依存new Class()ModuleServiceProvider 経由で注入する
PHPDoc の欠如doc ブロックがないドキュメントを追加する
strict_types の欠如declare がないすべてのファイルに追加する
ファットなクラスpublic メソッドが 5 つを超える責務を分割する
重複したロジック2 つ以上のファイルに同じコードService/Trait に抽出する
コーディング前の Grep 不足検索せずに作成まずコードベースを Grep する

ベストプラクティス

すべきことすべきでないこと
コンストラクタプロパティプロモーションを使用するプロパティ代入を使用する
インターフェースに依存する具象クラスに依存する
final readonly class を使用する可変クラスを使用する
declare(strict_types=1) を使用する型宣言を省略する
90 行で分割する100 行になるまで待つ
データ転送に DTO を使用する配列を使用する

Laravel 13 の注意事項

PHP 8.3 以上が必須

Laravel 13 には PHP 8.3 が必要です(L12 では 8.2 でした)。SOLID に適した機能:

  • readonly クラス: final readonly class UserDto(完全な不変性)
  • 型付きクラス定数: const int MAX_RETRIES = 3;
  • #[\Override] 属性: 親メソッドのオーバーライドを明示的に宣言します(タイポを検出)
  • ネイティブの json_validate()(json_decode + try/catch より高速)
  • 動的クラス定数フェッチ: $class::{$name}
use Override;

final readonly class PaymentService implements PaymentContract
{
    public const int DEFAULT_TIMEOUT = 30;

    public function __construct(
        private StripeClient $stripe,
        private LoggerInterface $logger,
    ) {}

    #[Override]
    public function process(PaymentDto $payment): PaymentResult
    {
        // ...
    }
}
L13 向けのより厳格な SOLID ルール
  • すべての DTO/値オブジェクトには final readonly class を優先する
  • すべての継承メソッドに #[\Override] を使用する(CI で検出)
  • 定数に型を付ける(const string ROLE = 'admin';)

コメント