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

Laravel Laravel

Laravelでバッチ処理を作成することも多々あるので、基本的なバッチ作成方法などを書きました。(よく使いそうなオプションなどのみ、まとめてます)
laravel的にはコマンドって言うみたいですが・・・🙃

laravelでバッチを作成する場合は、

  1. コンソールからコマンドでバッチファイルを作成する
  2. 作成したファイルに処理を記載する
  3. 自動で動かしたい場合は、cron(クーロン)の設定をする

という手順になります。

バージョンはlaravel7で試しています。公式のドキュメントはこちら

laravelでバッチ(コマンド)ファイルを作成するコマンド

下記のコマンドを実行してのファイルを作成します。

php artisan make:command [クラス名] 

実行例

今回は下記のように名前を付けて作ってみました。

php artisan make:command TestMyBatch

作成したファイルは?

実際に作成したファイルを見てみます。
初期ファイルの解説と実際に修正して、処理を書いてみます。

作成時の初期

上記の実行例で作成するとファイルはこんな感じになります。

<?php

namespace AppConsoleCommands;

use IlluminateConsoleCommand;

class TestMyBatch 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;
    }   
}

解説

ファイルを上から見ていきます。

$signature
– 実行するコマンドの名前になります。コンソールにて、ここで付けた名前で実行します。

$description
– コマンドの説明文です。
php artisanコマンド一覧などを表示させたときに、説明が出てきます。わかりやすい説明文を書いておきましょう。

constructメソッド
– 実行時にクラスが作られたときに処理されます。handleの前でやりたい処理を書いたりするといいと思います。

handleメソッド
実際に行いたい処理を書く場所になります。

修正する

クラスの中身を下記のように修正してみました。

class TestMyBatch extends Command 
{ 
    protected $signature = 'command:test'; 

    protected $description = 'laravel commandのtest'; 

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

    public function handle() 
    {   
        for ($i = 0; $i < 5; $i++) { 
          echo "Hello✋ n"; 
        }   

        return 0;  
    }   
}

コマンド名と説明文を上記のように変更して、
実際に行われる処理は[Hello✋]が5回出力されるだけです😆

実際に業務でバッチ処理を書く場合は、Eloquentを使ってデータベースからデータを取得してファイルを出力したりとか。
ファイルを読んでデータベースを更新するとかになると思います。

自分はちょっとした処理をテストしたいときとかに使ったりしてます。

コマンド説明文の確認

上記で作ったコマンドをphp artisanで確認すると、下記のように設定した内容が反映されています。

 command
  command:test         laravel commandのtest

バッチ(コマンド)を手動で動かす

バッチを動かすときは下記のようになります。

php artisan [signatureに設定したバッチ名]

作ったバッチ(コマンド)を動かしてみる

上記までで、作ったバッチを動かすと…

$ php artisan command:test
Hello✋ 
Hello✋ 
Hello✋ 
Hello✋ 
Hello✋ 

正常に動きました。

バッチ(コマンド)に引数を渡したい

バッチに引数を渡すときの方法とhandleメソッドで取得する方法を記載しています。

必須引数を設定する

$signatureの箇所に{引数名}を書いて、実行時に指定すると引数が渡ります。
この設定は必須の引数設定なので、実行時に引数がないとエラーになります。

protected $signature = 'command:test {name}';

実行例

下記のように記載した場合は

protected $signature = 'command:test {name}';

下記のように実行します。

php artisan command:test taro

null許可引数を設定する

引数をnull許可しておきたい場合は?を引数名の後ろに付けます。
こちらの設定は実行時に引数を省略できます。

protected $signature = 'command:test {name?} {age?}';

年齢だけ省略化のように下記のように書くこともできますが、

protected $signature = 'command:test {name} {age?}';

先に省略して、、みたいには書けません。
指定したものがどちらの引数か分からないからです..🙃

protected $signature = 'command:test {name?} {age}';

引数のデフォルト値を設定する

デフォルト値を渡すには{引数名=デフォルト値}で定義します。
引数が渡っていない場合はデフォルトの値で取得できます。

protected $signature = 'command:test {name=taro} {age=10}';

値なしオプション引数を設定する

–hogeみたいに実行時にオプションをつける場合は、下記のようにハイフンを2つ付けた後にオプション名を書きます。

protected $signature = 'command:test {--hoge}';

値ありオプション引数を設定する

–hoge=10みたいな感じで、オプション値に値をつける場合は下記のようにオプション名のとなりに=を書きます。

protected $signature = 'command:test {--hoge=}';

バッチ(コマンド)に渡された引数を取得する

バッチ実行時に渡された引数を取得する方法を書いています

渡した引数を取得する

渡した引数を取得する場合は、下記のように$this->argument(“引数名”);で取得します。

public function handle()
{   
  $age = $this->argument('age');
  $name = $this->argument('name');
  echo "{$age}歳の{$name}さん、Hello✋ n";
  return 0;
}   

値なしオプション値を取得する

$this->optionを呼び出して、オプション名を書くと取得できます。
オプションが付いている場合はtrueになります。

if ($this->option('hoge')) {
  echo "hogeオプションが付いていますn";
} else {
  echo "not hogeオプションn";
}   

値ありオプション値を取得する

$this->optionを呼び出して、オプション名を書くと取得できます。
返り値に入力した値が入っています。

こんな感じで呼び出すと…

php artisan command:test --hoge=test123

返り値に入っています..

echo $this->option('hoge'); // 結果:test123

まとめ

コマンドでバッチファイルを簡単に作成できました。
バッチには引数設定して、取得するのも簡単です。
プログレスバーなども付けれるようですので、詳しくは公式サイトを参照してみてください🥳

自動起動(スケジューラ)の設定は、こちらの記事に記載しています。

コメント

タイトルとURLをコピーしました