今回の記事ではArtisanコマンドの作成や使用方法について疑問や不安を抱えている方に向けて下記の内容を解説して行きます。
- Artisanコマンドの追加方法
- Artisanコマンドの呼び出し方
- Artisanコマンドの引数の受け取り方
今回の記事を参考に独自のカスタムコマンドを作成して開発プロセスをよりスムーズに進めて行きましょう。
Artisanコマンドの一覧を表示
独自のカスタムコマンドを作成する前に、予め用意されているArtisanコマンドの一覧を見ておきましょう。
一覧を確認するにはphp artisan listを実行します。
php artisan list
$ php artisan list
Laravel Framework 6.13.1
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
Available commands:
clear-compiled Remove the compiled class file
down Put the application into maintenance mode
db
db:seed Seed the database with records
db:wipe Drop all tables, views, and types
上記の実行結果はかなり省略しているので、実際にはこの10倍近いコマンドが表示されていると思います。
また、Laravelで開発をしたことがある方にはおなじみのphp artisan migrateやphp artisan route:listなどもArtisanコマンドの一部です。
Artisanコマンドを追加する流れ
Artisanコマンドの一覧の確認が出来たら、いよいよArtisanコマンドを自作していきます。
- make:commandでファイル作成
- コマンドの名前や説明を追加する
- コマンドの中身を実装していく
- 動作検証
Artisanコマンドを作成
新たなコマンドを作成する際には下記のコマンドを実行します
Console
$ php artisan make:command NewCommand
Console command created successfully.
コマンドの実行が成功すると、app/Console/Commands/のディレクトリ内にNewCommand.phpが作成されます。
上記のコマンドで指定したNewCommandの部分は、作成したいコマンドを表す命名にするようにしましょう。
また上記コマンドを実行した後は、php artisan listでコマンド一覧を確認すると新たにcommand: nameが追加されます。
Console
$ php artisan list
command
command:name Command description
コマンドの名前や説明を追加
コマンド追加用のファイルが作成出来たら、中身を変更していきましょう。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class NewCommand extends Command
{
protected $signature = 'command:name'; // このコマンドを実行するときに入力する文字列を指定する
protected $description = 'Command description'; // このコマンドの概要を簡潔に記す
public function __construct()
{
parent::__construct();
}
public function handle()
{
// ここにコマンドの実装を書いていく
}
}
$signatureにはコマンドを実行するために入力する文字列を入れます。
例えばphp artisan command:originalの様にコマンドを実行したい場合はcommand:originalを入れます。
$descriptionにはコマンドの概要を入れましょう。ここに入力した内容がphp artisan list実行時に表示されるので、完結でわかりやすいものにしておくと良いでしょう
今回は例として$signatureと$descriptionをそれぞれ下記のように変更しました。
NewCommand.php
protected $signature = 'command:original';
protected $description = 'Original Artisan command';
上記の2項目変更後はphp artisan listを再度実行し、変更が反映されているか確認してみましょう。
php artisan list
$ php artisan list
command
command:original Original Artisan command
コマンドの中身を実装して動作確認
ここからはコマンドの中身を実装して行きますが、基本的な書き方はControllerなどと変わりません。
文字列を出力するようにしてみる
まずはコマンドが実行されるかを検証するための、文字列を出力するコードを書いてみます。
NewCommand.php
public function handle()
{
// ここにコマンドの実装を書いていく
echo "test\n";
}
handle()の中にechoの1行を追加し、コマンドを実行してみましょう。
Console
$ php artisan command:original
test
testの文字が表示されれば成功です。
もしエラーが出た場合は、 $signatureや、php artisan list で実行方法が合っているかを確認してみましょう。
データベースからデータを取得して表示する
handle()の中ではControllerなどで開発をするのと同じように、他の処理を呼び出すことが出来ます。
ここでは1つの例としてUserモデルを使い、 存在するユーザーの一覧を表示してみます。
今回ユーザーテーブルにはテストデータとして下記のようなデータを入れています。
MySQL
mysql> select * from users;
+----+-------+-------------------+-------------------+----------+----------------+---------------------+---------------------+
| id | name | email | email_verified_at | password | remember_token | created_at | updated_at |
+----+-------+-------------------+-------------------+----------+----------------+---------------------+---------------------+
| 1 | test1 | test1@example.com | NULL | test | NULL | 2020-02-12 00:00:00 | 2020-02-12 00:00:00 |
| 2 | test2 | test2@example.com | NULL | test | NULL | 2020-02-12 00:00:00 | 2020-02-12 00:00:00 |
| 3 | test3 | test3@example.com | NULL | test | NULL | 2020-02-12 00:00:00 | 2020-02-12 00:00:00 |
+----+-------+-------------------+-------------------+----------+----------------+---------------------+---------------------+
3 rows in set (0.00 sec)
また上記のデータを入れるために流したSQL文は下記になります。
MySQL
mysql> insert into users (name,email,password,created_at,updated_at) values
('test1','test1@example.com','test','2020-02-12 00:00:00','2020-02-12 00:00:00'),
('test2','test2@example.com','test','2020-02-12 00:00:00','2020-02-12 00:00:00'),
('test3','test3@example.com','test','2020-02-12 00:00:00','2020-02-12 00:00:00');
テストデータの準備が出来たらhandle()の内部を実装していきましょう。
NewCommand.php
use App;
public function handle()
{
users = App\User::all();
foreach ($users as $user)
{
echo $user->name . "\n";
}
}
handle()の中でUserモデルのallメソッドを呼び出し、ユーザーを全件取得しています。
取得後はforeachを使い1件ずつ取り出し名前を表示。
またUserモデルを呼び出すためにuse App;を記載するのを忘れないようにしましょう。
上記の変更が完了したら、再度コマンドを実行して名前の一覧が正常に表示されるかを確認しましょう。
Console
$ php artisan command:original
test1
test2
test3
Artisanコマンドで引数を受け取りたい場合
ここまでで簡単なArtisanコマンドの実装をしてきました。
しかし時にはコマンドを実行する際に、引数を受け取ってその値を元に処理する必要があると思います。
その場合は下記のようにコマンドファイルの$signatureで受け取りたい変数を{}で囲うことにより受け取りが可能になります
NewCommand.php
protected $signature = 'command:original {count}';
設定した引数を受け取るにはargumentを使いましょう。
NewCommand.php
public function handle()
{
$count = $this->argument('count'); // countを取得する
echo "count: " . $count . "\n"; // countが取得出来ているか確認
$users = App\User::all();
foreach($users as $user)
{
echo $user->name . "\n";
}
}
上記の変更が終わったらコマンドを実行してcountが表示されるかを確認しましょう。
Console
$ php artisan command:original 2
count: 2
test1
test2
test3
count: 2が表示されれば成功です
番外編
askを利用することで引数からではなく、ユーザーに入力を尋ねることも出来ます。
$signatureの記述をprotected $signature = ‘command:original’;に戻してhandleの中身を下記に書き換えましょう。
NewCommand.php
public function handle() {
$first = $this->ask('first name ?');
$last = $this->ask('last name ?');
echo "name: " . $first . $last . "\n";
}
書き換え後はコンソールで動作確認をしましょう。
Console
$ php artisan command:original
first name ?: > hima
last name ?: > kuro
name: himakuro
名前が連結されて表示されれば成功です。
Artisanコマンドは簡単に作れる
今回はArtisanコマンドの作り方を解説しました。
この様なコマンドを追加するのが初めての場合は、難しいと感じるかもしれませんが、実際はコマンド1つでファイルが作成出来るのでとても簡単です。
外部APIを実行して定期的にデータを更新する必要がある場合などは、是非このArtisanコマンドで実装してみてください。