Laravelのモデル作成コマンドをカスタマイズする
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ファイルを作成することができました。