ソムリエでエンジニアのブログ

ワインの事も書きたいけど基本エンジニア用

php artisan make:modelコマンドのファイル生成先を変更する

はじめに

最近、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以下を編集しない理由については以下記事にまとめられていたのでご参照ください。

biz.addisteria.com

実装

コマンドファイルの作成

まずは新規コマンドファイルを作ります。
以下のコマンドを入力すると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のファイルを見つけられなくなりエラーになります。
こちらの解決については後日別記事でまとめたいと思います。