サイトアイコン IT NEWS

Laravel 5.5でcronで実行する独自Artisanコマンドを自作してみた

laravel-artisan-command

Laravelユーザーには既知の通り、Artisanという便利なコマンドラインインターフェイスが存在します。
今回の目的は、独自コマンド自作し、cronで定期実行することです。
以前紹介した、CSVデータ使ってデータベースへ自動でインポートするコマンドを作成します。

Artisanコマンドを作る

Artisanコマンドには、普段からよく使うコントローラーやモデルを作成するためのmake:~や、データベースを構築するためのmigrateが用意されています。
今回自作するコマンドcommand:~を使って実行します。
例として、importcsvというコマンド名で作成することにします。
完成するとこのように実行します。

php artisan command:importcsv

独自コマンドを作成する

新しくコマンドを作成するにもコマンドを使いますww
それが、make:commandです。

php artisan make:command ImportCsv

上記を実行するとappConsoleCommands直下にImportCsv.phpファイルが生成されたと思います。
先に完成形を書いて、後程解説していきます。

appConsoleCommandsImportCsv.php

<?phpnamespace AppConsoleCommands;use IlluminateConsoleCommand;
use IlluminateSupportFacadesLog;
use AppPost;
use Excel;class ImportCsv extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:importcsv';    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        parent::__construct();
        $this->post = $post;
    }    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->info('start!');
        $fields = $this->post->getFillable();
        $reader = Excel::load(storage_path('csv/data.csv'));
        $rows = $reader->toArray();
        $this->info('data.csv: '.count($rows).'rows');        foreach ($rows as $row){
            $id = $row[0];
            $record = $this->post->firstOrNew(['post_id' => $id]);
            foreach ($row as $key => $value) {
                $colmun = $fields[$key];
                $record->$colmun = $value;
            }
            $record->save();
            $this->info('Import Done: data.csv');
            Log::info('Import Done: data.csv');
        }        $this->info('Done!');
        Log::info('Import Done: End');
    }
}

解説

まずは使いたいモデルやパッケージを読み込みます。

use AppPost;
use Excel;

$signatureに実際叩く時のコマンド名を設定します。

protected $signature = 'command:importcsv';

このように設定すると、冒頭でもお伝えした通り、

php artisan command:importcsv

コマンドを実行することができます。$descriptionにはコマンドの説明を追加します。(任意です)

protected $description = 'これはCSVデータをデータベースにインポートするためのコマンドです';

例としてPostモデルを使うとためにコンストラクタを追加しています。

public function __construct(Post $post)
{
    ・・・
    $this->post = $post;
}

実際の処理はhandle()に記述します。

public function handle()
{
    ・・・
}

内容は以前と同じものですが、コンソール画面にメッセージを表示する、またログを出力するために少し手を加えてます。
詳細は下記のコントローラー内のimport()を参照
Laravel ExcelパッケージでCSVデータをDBへ一括登録する方法

進行状況、エラーの表示

進行状況をコンソール画面に表示するには、以下のメソッドを使います。

$this->info('message');

他にも、linecommentquestionerrorメソッドが用意されています。
違いがよくわかりませんが、色が変わるようです。また、ログを出力するには以下のようにします。

Log::info('message');

こちらも種類がありますので状況によって使い分けてください。

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::debug($message);
参考サイト

Artisanコンソール 5.5 Laravel
エラーとログ 5.5 Laravel

モバイルバージョンを終了