Laravel バッチ作成手順

#この記事について
laravel開発においてのバッチファイルの開発からユニットテストまでの備忘録としての記事になります。


#環境
PHP 8.0.1
Laravel 8.40.0

#目次
1. バッチファイル作成
2. コマンドファイルが作成されたら、プロパティのsignatureとdescriptionを名称を設定する
3. コマンドファイルのhandle箇所に処理を入れる。
4. コマンドのテストファイルを作成する。
5. テストケースを作成しテストの実行を行う。
6. スケジューラーの設定を行う。

##1. バッチファイル作成

- コマンドファイル作成コマンド

  ```
  $ php artisan make:command SampleCommand
  ```

  　作成されるディレクトリ：app/Console/Commands/SampleCommand.php

##2. コマンドファイルが作成されたら、プロパティのsignatureとdescriptionを名称を設定する。

- signatureはコマンドを実行する際の名称となります。<br>
  「sample:create」と設定した場合、コマンドは 「php artisan sample:create」で実行できます。

  ```
  $ php artisan sample:create
  ```

- descriptionはコマンドの名称を決定します。

```
<?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:create';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'サンプルコマンド';

```

※「php artisan list」でコマンドの一覧を確認できます。

```
 route
  route:cache                     Create a route cache file for faster route registration
  route:clear                     Remove the route cache file
  route:list                      List all registered routes
 salt
  salt:generate                   Set the hash salt for trait SearchEncrypted
 sample
  sample:create                   サンプルコマンド
```


##3. コマンドファイルのhandle箇所に処理を入れる。

```
    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
    　　$titles = ['タイトル1', 'タイトル2'];
       foreach($titles as $val) {
           $article = new Article();
           $article->title = $val;
           $article->save();
       }

        return 0;
    }
```

##4. コマンドのテストファイルを作成する。

- コマンドのテストファイルを作成する。

  ```
  $ php artisan make:test Commands/SampleCommandTest
  ```

   作成されるディレクトリ：　tests/Feature/Commands/SampleCommandTest.php

##5. テストケースを作成しテストの実行を行う。

- バッチの実行は以下のようにコマンド名をテストケース内でArtisan::callを使用し指定する。

```
<?php
namespace Tests\Feature\Commands;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Artisan;
use Tests\TestCase;

class SampleCommandTest extends TestCase
{
    use RefreshDatabase;

    public function test_command()
    {
        Artisan::call('sample:create');
        $response->assertStatus(200);
    }
}
```

- テストファイルの実行

  ```
  $ ./vendor/bin/phpunit tests/Feature/Commands/SampleCommandTest.php
  ```

##6. スケジューラーの設定を行う。

  設定を行うファイル: app/Console/Kernel.php

```
class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule): void
    {
         $schedule->command('sample:create')->hourly(); // 1時間毎に設定
    }
```

- スケジューラーの確認を行う。

  ```
  $ php artisan schedule:list
  +----------------------------------------------+-----------+-------------+----------------------------+
  | Command                                      | Interval  | Description | Next Due                   |
  +----------------------------------------------+-----------+-------------+----------------------------+
  | '/usr/local/bin/php' 'artisan' sample:create | 0 * * * * |             | 2021-08-16 19:00:00 +09:00 |
  +----------------------------------------------+-----------+-------------+----------------------------+
  ```