🐣

Laravelでカスタムコマンド作成

2024/08/26に公開

はじめに

クリーンアーキテクチャを採用しており、UseCaseクラスなどを手で作成するのが手間だったためカスタムコマンドを作成することとなった。
その作成手順の備忘録。

環境

  • version: Laravel 10.x系

作成手順

1. 雛形の作成

app/stubs/配下に、.stub拡張子のファイルを作成します。
これが作成したいクラスの雛形となります。

$ cd app
$ touch stubs/usecase.stub

もし既存のartisanコマンドを修正したい場合は、以下コマンドでstubファイル一覧が生成されます。

$ php artisan stub:publish

雛形の中身を記述します。

app/stubs/usecase.stub
<?php>
namespace {{ context }};

Class {{ resource }}
{
    //
}

2. コマンド生成

以下コマンドで作成したいコマンドを生成します。

$ php artisan make:command MakeUseCase

3. コマンドの実装

作成したstubファイルを元に、クラスを生成するための実装をしていきます。

app/Console/Commands/MakeUseCase.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;

class MakeUseCase extends Command
{
    /**
     * コンソールコマンドの名前と使い方.
     *
     * @var string
     */
    protected $signature = 'make:usecase {context} {resource}';

    /**
     * コンソールコマンドの説明.
     *
     * @var string
     */
    protected $description = 'Create a new use-case class';

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * consoleコマンドの実行.
     */
    public function handle()
    {
        // コマンド引数を取得します.
        $context = ucfirst($this->argument('context'));
        $resource = $this->argument('resource');

        $directory = app_path("UseCase/{$context}");
        $path = "{$directory}/{$resource}UseCase.php";

        // 雛形を指定します.
        $stub = File::get(base_path("stubs/usecase.stub"));
        // クラス名やnamespaceなどでコマンド引数を使いたいため置換します.
        $content = str_replace(['{{ resource }}', '{{ context }}'], [$resource, $context], $stub);

        // クラスパスが存在しない場合は作成します.
        $this->makeDirectory($directory);
        // 雛形を元にクラスファイルを生成します.
        File::put($path, $content);

        $this->info("UseCase created successfully: {$path}");
    }

    private function makeDirectory($path)
    {
        if (!File::exists($path)) {
            File::makeDirectory($path, 0755, true);
        }
    }
}

4. 動作確認

クラス コマンド 生成ファイル
UseCase php artisan make:usecase index Products app/UseCase/Index/ProductsUseCase.php

参考文献

Laravel 10.x Artisanコンソール

Discussion