Laravelでバッチ処理(artisanコマンド)を作成する方法

バックエンドエンジニアと言えばWebアプリケーションのサーバーサイドの開発だけではなく、バッチ処理などのCLIで実行するようなコマンドラインアプリケーションを開発する機会も多いかと思います。

Laravelではバッチ処理などを実装するartisanコマンドを簡単に作成することができます。

この記事ではLaravelでartisanコマンドの作成方法を解説していきたいと思います。

目次

artisanコマンドを作成する

Laravelでは下記のコマンドでCommandクラスを継承したartisanコマンドを実装するためのファイルを簡単に作成することができます。

php artisan make:command SampleCommand

コマンドを実行すると、app/Console/Commandsディレクトリ直下にSampleCommand.phpファイルが生成されます。

SampleCommand.phpにはartisanコマンドを作成するための雛形が記述されています。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SampleCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        return 0;
    }
}

SampleCommandクラスにはファイルが生成された時点で2つのプロパティと2つのメソッドが用意されているのがわかりますね。

$signatureプロパティの値でartisanコマンドの識別子を定義します。

$descriptionプロパティの値でartisanコマンドの処理内容の説明文を記載します。

コンストラクタメソッドでは、継承している親クラスのコンストラクタメソッドを呼んでいるだけですね。

handleメソッドに作成するコマンドで行う実際の処理を記述します。

基本的にはたったこれだけでartisanコマンドを作成することができます。

では、実際にサンプルコマンドを作成してみましょう。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SampleCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sample';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'これはサンプルコマンドです。';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        dump('サンプルコマンド実行');

        return 0;
    }
}

サンプルコマンドは$signature'sample'を定義しているので、こちらのartisanコマンドはphp artisan sampleで実行することができるようになります。

$descriptionにはサンプルコマンドの説明文が記載されているだけですね。

handleメソッドにコマンドの処理内容を記述しますが、今回はサンプルコマンドで単純に動作を確認したいだけなので、dumpメソッドで実行されたことが分かるようにしているだけです。

作成したコマンドを登録する

実はSampleCommandを作成しただけではartisanコマンドを実行することができません。

Laravelアプリケーションに作成したSampleCommandを登録する必要があります。

では、SampleCommandを登録していきましょう。

app/Consoleディレクトリ直下にKernel.phpというファイルが存在します。

<?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 = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

ここで注目するのは$commandsプロパティの配列です。

この配列の中に作成したコマンドを追加することで、artisanコマンドとして利用することができるようになります。

use App\Console\Commands\SampleCommand;

protected $commands = [
    SampleCommand::class
];

先ほど作成したSampleCommandクラスをuseして、SampleCommand::class$commands配列に追加します。

これで作成したSampleCommandが登録されて、artisanコマンドとして実行することができるようになりました。

作成・登録したコマンドの確認

それでは、SampleCommandを実行してみましょう。

まず、artisanコマンドとして登録されているかしっかり確認しておきましょう。

登録されたコマンドを確認するためには、下記のコマンドを実行することで確認することができます。

php artisan list

このコマンドを実行することで自分で作成・登録したコマンドだけではなく、Laravelでデフォルトで使えるコマンドの一覧を確認することができます。

作成したコマンドが無事に登録されていれば下記の表示がされています。

$ php artisan list
Available commands:
  ...
  sample               これはサンプルコマンドです。
  ...

SampleCommandクラスの$signatureプロパティに定義したsampleと、$descriptionプロパティに定義した説明文が表示されていることが確認できます。

では最後にSampleCommandのartisanコマンドを実行してみましょう。

$ php artisan sample
"サンプルコマンド実行"

無事にartisanコマンドが実行されていることが確認できました。

基本的なartisanコマンドの作成がこれでできるようになりましたね。

引数を定義する

artisanコマンド作成する際に、ユーザーが入力する値を引数として受け取るように定義することができます。

{引数名}と定義することで引数として認識させることができます。また、引数を任意にしたり、デフォルト値を指定することもできます。

// 必須の引数定義
protected $signature = 'sample {arg}';

// 任意の引数定義
protected $signature = 'sample {arg?}';

// デフォルト値を持つ引数定義
protected $signature = 'sample {arg=hoge}';

入力された引数を取得するにはargumentメソッドを利用します。

argumentメソッドの引数には定義した引数名を指定することで該当の引数に入力された値を取得することができます。

public function handle()
{
    $value = $this->argument('arg');
}

引数を複数定義した場合に、全ての引数を取得するには、argumentsメソッドを使用することで入力された値を取得することができます。

public function handle()
{
    $value = $this->arguments();
}

オプションを定義する

artisanコマンドでは、引数だけではなくオプションを定義することもできます。

{--オプション名}と定義することでオプションとして認識させることができます。

コマンド実行時に--オプションを指定して実行するとオプションの値はtrueとなり、何も指定しなければオプションの値はfalseとなります。

また、オプションは値を取るオプションを指定したり、デフォルト値を指定することもできます。

// オプション定義
protected $signature = 'sample {--opt}';

// 値を取るオプション定義
protected $signature = 'sample {--opt=}';

// デフォルト値を持つオプション定義
protected $signature = 'sample {--opt=hoge}';

指定されたオプションを取得するにはoptionメソッドを利用します。

optionメソッドの引数には定義したオプション名を指定することで該当のオプションの値を取得することができます。

public function handle()
{
    $value = $this->option('opt');
}

オプションを複数定義した場合に、全てのオプションの値を取得するには、optionsメソッドを使用することで指定されたオプションの値を取得することができます。

public function handle()
{
    $value = $this->options();
}

作成したコマンドを別のコマンドから呼び出す

作成したartisanコマンドはCLIでの実行だけではなく、別の作成したコマンドから実行することもできます。

プログラムからのartisanコマンドの実行はcallメソッドを使用することでできます。

public functon handle()
{
    $this->call('sample', [
        'arg' => 'foo',
        '--opt' => 'bar'
    ]);
}

callメソッドの第一引数に$signatureで定義した識別子を指定し、第二引数には連想配列の形式で引数やオプションを指定することもできます。

まとめ

Laravelでartisanコマンドを作成する方法を紹介してきました。

これでLaravelを使って簡単にバッチ処理を実装することが実感できたかと思います。

これを機会に公式リファレンスを確認したり、ご自身でバッチ処理の実装を行なってさらに理解を深めてくださいね。

プログラミングスクールをお探しの方はこちら

フリーランス案件をお探しの方はこちら

エンジニア転職サイトをお探しの方はこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次