Skip to main content

GeneratorCommand とは

Illuminate\Console\GeneratorCommand は、Laravel のすべてのコード生成コマンドの基底となる抽象クラスです。make:modelmake:controllermake:request などはすべてこのクラスを継承しています。 パッケージで独自の make:xxx コマンドを提供すると、ユーザーはクラスを手動で作成する代わりに php artisan make:handler OrderHandler のように実行するだけで正しい名前空間のファイルが生成されます。
GeneratorCommand は公式ドキュメントにほとんど記載がなく、フレームワークのソースコードを直接読まないと分かりません。典型的な上級トピックです。

最小限の実装

GeneratorCommand を継承したクラスに必要な実装は getStub() メソッドのみです。それ以外のプロパティはオプションですが、実際には以下を揃えます。 make:handler コマンドを実装する例を示します。
getDefaultNamespace() を設定すると、php artisan make:handler OrderHandler を実行したときに App\Handlers\OrderHandler クラスが app/Handlers/OrderHandler.php に生成されます。

stub ファイルの作成

getStub() が返すパスに stub ファイルを配置します。stub はテンプレートとなる PHP ファイルで、プレースホルダーが名前空間とクラス名に置換されます。
src
Console
Commands
HandlerMakeCommand.php
stubs
handler.stub
stub ファイルの例:
handler.stub
GeneratorCommand は stub 内の以下のプレースホルダーを自動的に置換します。 {{ namespace }}DummyNamespace はどちらを使っても同じ結果になります。Laravel 組み込みの stub は両方の形式を含んでいましたが、新しく作る場合は {{ namespace }} 形式を推奨します。

stub のカスタマイズを可能にする

ユーザーが stub を上書きできる仕組みを提供するには、resolveStubPath() パターンを使います。まずサービスプロバイダーの boot() で stub を公開します。
次に getStub() でユーザーがカスタマイズした stub を優先的に使います。
php artisan vendor:publish --tag=stubs を実行したユーザーはプロジェクトルートの stubs/handler.stub を編集してテンプレートを変更できます。
resolveStubPath() は Laravel 組み込みの RequestMakeCommand でも使われているパターンです。パッケージを公開する場合はこのパターンを採用してください。

サービスプロバイダーへの登録

コマンドはサービスプロバイダーの boot() メソッドで登録します。runningInConsole() で確認することで、Web リクエスト時の無駄なロードを防げます。
パッケージの composer.jsonextra.laravel を設定しておくと、ユーザーはサービスプロバイダーを手動登録しなくて済みます。

活用例

GeneratorCommand が活躍するユースケースをいくつか示します。
認証チェックやカスタムバリデーションロジックを含む独自の基底クラスを継承した Request を生成するコマンド。getDefaultNamespace()App\Http\Requests を返します。
Data Transfer Object のボイラープレートを生成するコマンド。readonly プロパティや from() ファクトリメソッドを含む stub を用意します。
単一責任の Action クラスを生成するコマンド。App\Actions 名前空間に execute() メソッドを持つクラスを生成します。
make:livewire コマンドは GeneratorCommand を継承した MakeCommand クラスで実装されています。コンポーネントクラスと Blade ビューの 2 ファイルを同時生成するために handle() をオーバーライドしています。

テスト

Orchestra Testbench を使って、コマンドが正しくファイルを生成することをテストします。
Generator コマンドは実際のファイルシステムに書き込みます。tearDown() で必ずクリーンアップしてください。テストが途中で失敗した場合でも確実に実行されます。

関連ページ

Laravelパッケージ開発

サービスプロバイダーを使ったパッケージ開発の基礎を確認します。

Orchestra TestbenchでLaravelパッケージをテストする

パッケージテストの基盤の作り方を確認します。
最終更新日 2026年4月30日