MakefileでLaravelのファイル作成を楽にしてみた

Makefileの画像その他

Controller、Request、Resource、Actionファイルを一つずつ作るの面倒くさ〜い。

はじめに

上野です!
今回はLaravelでのファイル作成をより楽にできないかなと思い、Makefileで複数ファイルを一括作成できるようにしてみました!
ちなみに、今回一括作成したいファイルは1メソッドのみのControllerファイル、Requestファイル、Resourceファイル、Actionファイルの4つのファイルです。

Makefileとは

makeコマンドは、コンパイル作業を行うために様々な作業を自動的に行うためのコマンドです。「Makefile」は、コンパイル、依存関係の管理、インストールなどのルールを記述しておくためのファイルで、makeコマンドが読み込んで処理を行います。Makefileには、ファイルの生成手順や、プログラムを構成しているファイル同士の関係を記述します。

参考元の記事:https://linuc.org/study/knowledge/542/



簡単な例だと、下記のように実行したいルールをMakefileに書いておけば、

make [実行したいルール]

で呼び出すことができます。

Makefile

build:
	docker compose up -d --build
greeting:
        touch greeting.txt
        @echo 'Good morning' >> greeting.txt
        @echo 'Hello' >> greeting.txt
        @echo 'Good evening' >> greeting.txt

Makefileが存在する階層のターミナル上で make build とするとdocker composeのbuildが始まります。
make greeting とすると下記のようなファイルが作成されます。

実行環境とLaravelのフォルダ構成

実行環境:macOS(macの方であれば、インストールしなくてもmakeコマンドが実行できます。)

Docker Composeの構成

- api (Laravel)
- nginx
- db (Mysql)
- front (Next.js)

Laravelのフォルダ構成

- api
   - app
      - Http
         - Controllers
            - API
               - User
                  - GetUser.php                 // Makefileを利用して作成したファイル
         - Requests
            - User
               - GetUserRequest.php      // Makefileを利用して作成したファイル
         - Resources
            - User
               - GetUserResource.php    // Makefileを利用して作成したファイル
      - Models
      - Providers
      - UseCases 
         - User
            - GetUserAction.php           // Makefileを利用して作成したファイル
   - config
   - database
   ...以下省略
- front (Next.js)
- docker-compose.yml
- Makefile                                          // 左記Makefileを利用し複数のファイルを一括作成します
- MakefileDir
   - TestAction.php                          // Actionファイルを作成する際の元となるファイル

MakefileDir/TestAction.php

<?php

namespace App\UseCases\DIR;

class NAME
{
    public function __invoke()
    {
        return;
    }
}


下記のなんちゃってクリーンアーキテクチャのフォルダ構成を参考に、原則1ファイル1アクションという構成にしています。

参考元の記事:https://zenn.dev/mpyw/articles/ce7d09eb6d8117

Makefileでファイル作成を簡素化

今回はDocker環境でのファイル作成を想定しています。もし、Docker環境をご利用でない場合は
docker compose exec api
の部分を削除し、php artisanコマンドが実行できるフォルダ階層にMakefileを作成していただけると同じように実行できます。

ちなみに、今回は自由にディレクトリとファイル名を指定して作成できるようにしています。
$(DIR)、$(NAME) となっている部分は変数ですので、makeコマンドを実行する際、引数に2つの変数(DIR、NAME )を渡す必要がありますのでご注意ください。

コントローラファイルの作成用のルール

create-controller:
	docker compose exec api php artisan make:controller API/$(DIR)/$(NAME) --invokable

リクエストファイルの作成用のルール

create-request:
	docker compose exec api php artisan make:request $(DIR)/$(NAME)'Request'

リソースファイルの作成用のルール

create-resource:
	docker compose exec api php artisan make:resource $(DIR)/$(NAME)'Resource'

アクションファイルの作成用のルール

create-action:
	mkdir -p ./api/app/UseCases/$(DIR)
	cp ./MakefileDir/TestAction.php ./api/app/UseCases/$(DIR)/$(NAME)'Action.php'
	sed -i.bk -e 's/DIR/'$(DIR)'/g' ./api/app/UseCases/$(DIR)/$(NAME)'Action.php'
	sed -i.bk -e 's/NAME/'$(NAME)'Action/g' ./api/app/UseCases/$(DIR)/$(NAME)'Action.php'
	rm ./api/app/UseCases/$(DIR)/$(NAME)'Action.php.bk'

Controller、Request、Resource、Actioinファイル一括作成用のルール

create-controller:
	docker compose exec api php artisan make:controller API/$(DIR)/$(NAME) --invokable
create-request:
	docker compose exec api php artisan make:request $(DIR)/$(NAME)'Request'
create-resource:
	docker compose exec api php artisan make:resource $(DIR)/$(NAME)'Resource'
create-action:
	mkdir -p ./api/app/UseCases/$(DIR)
	cp ./MakefileDir/TestAction.php ./api/app/UseCases/$(DIR)/$(NAME)'Action.php'
	sed -i.bk -e 's/DIR/'$(DIR)'/g' ./api/app/UseCases/$(DIR)/$(NAME)'Action.php'
	sed -i.bk -e 's/NAME/'$(NAME)'Action/g' ./api/app/UseCases/$(DIR)/$(NAME)'Action.php'
	rm ./api/app/UseCases/$(DIR)/$(NAME)'Action.php.bk'
create-api:
	@make create-controller
	@make create-request
	@make create-resource
	@make create-action

上記Makefileファイルを定義したうえで、下記コマンドを実行するとContorller、Requset、Resource、Actionファイルがそれぞれ作成されます。

make create-api DIR=User NAME=GetProfile

実行後作成されるファイル
・./api/app/Http/Controllers/API/User/GetProfile.php
・./api/app/Http/Requests/User/GetProfileRequest.php
・./api/app/Http/Resources/User/GetProfileResource.php
・./api/app/UseCases/User/GetProfileAction.php

また、コントローラファイルだけリクエストファイルだけ作成したいという場合は、下記のコマンドを実行するだけで作成することができます。

コントローラファイルの作成

make create-controller DIR=User NAME=GetProfile

リクエストファイルの作成

make create-request DIR=User NAME=GetProfile

まとめ

今回は少し面倒なファイル作成を一括で作成できるようにしてみました。今回はMakefileで実装しましたが、Laravelでも同じようにカスタマイズしたコマンドを作成し、1つのコマンドで複数のファイルを作成できるようなので、今度試してみたいと思います!
これからも開発の中で楽ができそうな箇所があればMakefileなどを活用してもっと簡素化していき、こちらで情報共有できればと思います!

今回は以上となります。ありがとうございました!

コメント