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

Laravelユーザーには既知の通り、Artisanという便利なコマンドラインインターフェイスが存在します。
今回の目的は、独自コマンドを自作し、cronで定期実行することです。
以前紹介した、CSVデータ使ってデータベースへ自動でインポートするコマンドを作成します。
LaravelでExcelを操作するための「Laravel Excel」というパッケージがありあます。今回はそれを利用してCSVファイルをデータベースへ簡単にインポートする方法をご紹介します。CSVを使ったデータの一括登録にとても便利です!Laravel ExcelでCSVをインポートLaravel ... Laravel ExcelパッケージでCSVデータをDBへ一括登録する方法 - Minory |
Artisanコマンドを作る
Artisanコマンドには、普段からよく使うコントローラーやモデルを作成するためのmake:~
や、データベースを構築するためのmigrate
が用意されています。
今回自作するコマンドはcommand:~を使って実行します。
例として、importcsv
というコマンド名で作成することにします。
完成するとこのように実行します。
php artisan command:importcsv
独自コマンドを作成する
新しくコマンドを作成するにもコマンドを使いますww
それが、make:command
です。
php artisan make:command ImportCsv
上記を実行すると\app\Console\Commands
直下にImportCsv.php
ファイルが生成されたと思います。
先に完成形を書いて、後程解説していきます。
\app\Console\Commands\ImportCsv.php
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use App\Post;
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 App\Post;
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');
他にも、line
、comment
、question
、error
メソッドが用意されています。
違いがよくわかりませんが、色が変わるようです。
また、ログを出力するには以下のようにします。
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
コメント
コメントを投稿