コンテンツにスキップ

Top

Laravel で コマンドラインアプリケーション を作成する

シェルスクリプトやバッチからLaravelの関数をキックしたいなぁ、と思ったのだけどどうしたらいいかよくわからんなぁ、と思っていたらコマンドラインアプリケーションなるものがあるのでそれを作る(ほかにはweb api経由で呼び出す、という方法があり、まぁなんかそっちのほうがLaravel的にはきれいじゃね?とか思ったけどまぁいいや)

コマンドラインアプリケーションの作り方

Windowsで説明。

php artisan test:hoge と打つとLaravelサーバ上のHogeController::handle関数がキックされるようにする。
(handle関数内でさらにほかのControllerを呼び出すことで任意の関数を呼び出す)

まずはコマンドプロンプトを開き以下を実施してコマンドコントローラーを作成する。
コマンドコントローラーは1コマンドにつき1つ作ったほうがわかりやすい。

php artisan make:command TestHoge

すると、以下のファイルができるので、

\app\Console\Commands\TestHoge.php
中を開いて以下のsignature部分を直す。
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:test-hoge';

    →

    protected $signature = 'test:hoge';

んで、昔は

\app\Console\Kernel.php  
ファイルを開いて、上のほうにある protected $commands の配列に今作ったクラスを追加する。
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\TestHoge::class,
    ];
みたいなことしないといけなかったけど、 Laravel 11 とかだと、
    protected function commands(): void
    {
        $this->load(__DIR__.'/Commands');
で、Commandsディレクトリ配下のやつ勝手にロードするから何も指定しなくてよい。

この状態で、

php artisan list
とすると、下のほうに、
 test
  test:hoge              Command description
と出ているはずである。

で、

php artisan test:hoge
を実施すると、TestHoge::classの handle 関数がコールされるわけだが、handle関数内で何もしていないのでさっぱりわからんから、ログを出す。
    /**
     * Execute the console command.
     */
    public function handle()
    {
        Log::info("Hello World!");
    }
とやってログを書き出して、storage\logs配下のログを見て動作を確認する。

んで、このhandleの中でごちゃごちゃ書くというよりも、handleの中から他のControllerのクラスを呼び出して使う。
例えばHogeControllerのhoge()を呼び出したい場合、useを設定して、newすれば使える。

use App\Http\Controllers\HogeController;

~

public function handle()
    {
        $controller = new HogeController();
        $result = $controller->hoge(); 
    }

以上。