Laravelのmake:modelコマンドをカスタマイズする方法
web-application-framework laravel
Laravelのモデル作成コマンド php artisan make:model の挙動をカスタマイズします。
今回は --migration オプションをつけたときに生成されるMigrationファイルの場所を変更します。

参考ページ
環境
- Laravel 11
カスタマイズの流れ
1. モデル作成コマンドのクラスを継承したクラスを作成する
以下のArtisanコマンドでモデル作成コマンドのクラスを継承するクラスを作成します。
php artisan make:command ModelMakeCommand
作成したクラスのプロパティとメソッドをすべて削除します。
app/Console/Commands/ModelMakeCommand.php :
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ModelMakeCommand extends Command
{
}
モデル作成コマンドのクラスを継承するように継承先を変更します。
継承先のクラスは今回はComposerでインストールしたパッケージの中の vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php でした。
app/Console/Commands/ModelMakeCommand.php :
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ModelMakeCommand extends \Illuminate\Foundation\Console\ModelMakeCommand
{
}
2. コマンドの挙動をカスタマイズする
今回は --migration オプションをつけたときに生成されるMigrationファイルのパスをいじるので、継承先のクラスを見てそれっぽい関数をオーバーライドします。
createMigration 関数をコピペします。
app/Console/Commands/ModelMakeCommand.php :
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ModelMakeCommand extends \Illuminate\Foundation\Console\ModelMakeCommand
{
/**
* Create a migration file for the model.
*
* @return void
*/
protected function createMigration()
{
$table = Str::snake(Str::pluralStudly(class_basename($this->argument('name'))));
if ($this->option('pivot')) {
$table = Str::singular($table);
}
$this->call('make:migration', [
'name' => "create_{$table}_table",
'--create' => $table,
]);
}
}
make:migration を呼び出す処理に --path オプションを追加します。
今回はMigrationファイルのディレクトリ構造をモデルの構造と同じにします。
app/Console/Commands/ModelMakeCommand.php :
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ModelMakeCommand extends \Illuminate\Foundation\Console\ModelMakeCommand
{
/**
* Create a migration file for the model.
*
* @return void
*/
protected function createMigration()
{
$table = Str::snake(Str::pluralStudly(class_basename($this->argument('name'))));
if ($this->option('pivot')) {
$table = Str::singular($table);
}
$dirName = dirname($this->getNameInput()); // 追加
$this->call('make:migration', [
'name' => "create_{$table}_table",
'--create' => $table,
'--path' => 'database/migrations' . ($dirName === '.' ? '' : "/{$dirName}"), // 追加
]);
}
}
3. 動作確認する
カスタマイズした php artisan make:model を試してみます。
$ php artisan make:model test/Test --migration
INFO Model [app/Models/test/Test.php] created successfully.
INFO Migration [database/migrations/test/2025_03_21_075119_create_tests_table.php] created successfully.
モデルと同じディレクトリ構造のMigrationファイルを作成することができました。
関連記事
- Laravel + ReactでQRコードを生成・表示する方法【qrcode.react】
- Stripeの支払い成功後にWebhooksで購入後の処理を実行する
- Laravel Cashier (Stripe) インストールでつまずいた話
- なぜLaravelでfetchを使うと419エラーが発生するのか?
- Laravel + shadcn/ui ページネーション
- LaravelプロジェクトからPostgreSQLを操作する
- LaravelでInertia.js + shadcn/uiフォームを実装する
- LaravelとReactプロジェクトのセットアップ
- LaravelプロジェクトにBootstrapをインストールする
- PHPUnitでテスト用データベースを使う