はじめに
最近、Laravelで開発しているプロジェクトにオニオンアーキテクチャを意識したディレクトリ構成を採用しました。
導入したディレクトリ構成ではモデルファイルをInfrastrucure/Eloquent/
ディレクトリ 以下に置くよう変更を加えたいと思っています。
ここで一つ問題が、、、Laravel8系のデフォルトでは、モデルファイルがModels
ディレクトリ 以下に位置しており、php artisan make:models ファイル名
のコマンドを利用するとModels/ファイル名
という階層でモデルファイルが作成されてしまいます。
採用したディレクトリ 構成に合うようphp artisan make
コマンドの生成先を変更したいと思い実現方法を知れべたのでこちらにまとめておきます。
※オニオンアーキテクチャに関しては今回の本題でない為説明を省きます。
環境
現状の処理を調査する
まずphp artisan make:model
コマンドの生成先がどこで定義されているかを調べていきます。
生成先が定義されているのは、vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php
ファイルにあるgetDefaultNamespace
です。
<?php class ModelMakeCommand extends GeneratorCommand { ...略.... /** * Get the default namespace for the class. * * @param string $rootNamespace * @return string */ protected function getDefaultNamespace($rootNamespace) { return is_dir(app_path('Models')) ? $rootNamespace.'\\Models' : $rootNamespace; } ... 略.... }
上記の通りphp artisan make:model
コマンドはModels
ディレクトリが存在する場合、Models
以下にファイルを作成するようになっています。
Modelsディレクトリ を削除、毎回php artisan make:model Infrastructure/Eloquent ~
と入力しても希望の形にはなりますがタイプが面倒です。
そこでこのメソッドを改良していきます。
ただしvendor以下を直接変更するのではなくオーバーライドしていきます。
※vendor以下を編集しない理由については以下記事にまとめられていたのでご参照ください。
実装
コマンドファイルの作成
まずは新規コマンドファイルを作ります。
以下のコマンドを入力するとapp/Console/Commands/ModelMakeCommand.php
が作成されます。
$ php artisan make:command ModelMakeCommand
メソッドをオーバーライド
作成されたファイル内でメソッドをオーバーライドします。
<?php namespace App\Console\Commands; use Illuminate\Foundation\Console\ModelMakeCommand as ConsoleModelMakeCommand; class ModelMakeCommand extends ConsoleModelMakeCommand // ←元のコマンド定義を継承 { /** * Get the default namespace for the class. * * @param string $rootNamespace * @return string */ protected function getDefaultNamespace($rootNamespace) { return $rootNamespace . '\\Infrastructure\\Eloquent'; } }
クラスをConsole/Kernelに登録
app/Console/Kernel.php
に作成したModelMakeCommand
を登録します。
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ 'App\Console\Commands\ModelMakeCommand' // 作成したコマンドを追加 ]; ... 略 ... }
上記の手順でphp artisan make:model
のファイル生成先を変更する事ができました。
同様にコントローラーの作成先などを変更する事も可能です。
注意点
Laravel8系ではモデルファイルを移動させるとFactoryのファイルを見つけられなくなりエラーになります。
こちらの解決については後日別記事でまとめたいと思います。