Laravel PR

LaravelのArtisanコマンドを3分で自作する方法!サンプルコードと共に徹底解説!

Laravelでartisanコマンドを 3分で自作する方法! サンプルコード_と共に徹底解説! (1)
記事内に商品プロモーションを含む場合があります

今回の記事では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 migratephp artisan route:listなどもArtisanコマンドの一部です。

 

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

 

コマンドの名前や説明を追加

コマンド追加用のファイルが作成出来たら、中身を変更していきましょう。

NewCommand.php

<?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コマンドで実装してみてください。

ABOUT ME
himakuro
新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、MENTAで未経験者の方にプログラミングを指導しています。
PR
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール