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

7 min
Laravelでartisanコマンドを 3分で自作する方法! サンプルコード_と共に徹底解説! (1)
https://himakuro.com/wp-content/uploads/2020/02/boy-programming.png

  • Artisanコマンドを作りたいけど追加方法がわからない!
  • Artisanコマンドの呼び出し方がわからない!
  • Artisanコマンドで引数の受け取り方がわからない!

今回の記事ではこんな悩みを解決して行きます。

LaravelはPHPのフレームワークの中でいま最も波が来ているフレームワークです。

Laravelが人気の理由

  • 豊富な機能が備わっているので、PHPの開発をよりスピーディーに出来る
  • 日本語のドキュメントが豊富で問題解決がしやすい
  • 動かすだけなら比較的少ない学習コストで可能

そしてそんなLaravelにはArtisan(アルチザン)と言うコマンドラインインターフェイスが存在し、マイグレーションやルーティングの確認などを1つのコマンドで実行出来るような機能も兼ね備わっています。

Artisanコマンドは数十を超えるコマンドが搭載されていますが、自作することも可能になっており、今回はこのArtisanコマンドを自作する方法を解説していきます。

独自のカスタムコマンドを作成することで、開発をよりスムーズにして行きましょう。

Artisanコマンドの一覧を表示

独自のカスタムコマンドを作成する前に、Artisanコマンド一覧を見ておきましょう。

一覧を確認するには php artisan list を実行します。

Title


$ 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倍近いコマンドが表示されていると思います。

またおなじみの 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 を再度実行し、変更が反映されているか確認してみましょう。

Title


$ php artisan list
 command
   command:original Original Artisan command
https://himakuro.com/wp-content/uploads/2018/12/himakuro-plain-reverse.png

himakuro

次の項目からコマンドの中身を実装していくよ!

コマンドの中身を実装して動作確認

ここからはコマンドの中身を実装して行きますが、基本的な書き方はControllerなどと変わりません。

文字列を出力するようにしてみる

まずはコマンドが実行されるかを検証するための、文字列を出力するコードを書いてみます。

NewCommand.php


public function handle()
{
    // ここにコマンドの実装を書いていく
    echo "test\n";
}

handle() の中に echo の1行を追加し、コマンドを実行してみましょう。

Console


$ php artisan command:original test
https://himakuro.com/wp-content/uploads/2018/12/himakuro-happy-reverse.png

himakuro

testの文字が表示されれば成功だよ!もしエラーが出た場合は、 $signatureや、php artisan list で実行方法が合っているかを確認してみよう!

データベースからデータを取得して表示する

handle() の中では Controller などで開発をするのと同じように、他の処理を呼び出すことが出来ます。

ここでは1つの例としてUserモデルを使い、 存在するユーザーの一覧を表示してみます。

今回ユーザーテーブルにはテストデータとして下記のようなデータを入れています。

Title


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文は下記になります。

Title


 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


user 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 
https://himakuro.com/wp-content/uploads/2018/12/himakuro-happy-reverse.png

himakuro

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 
https://himakuro.com/wp-content/uploads/2018/12/himakuro-plain-reverse.png

himakuro

名前が連結されて表示されれば成功だよ!

Artisanコマンドは簡単に作れる

今回はArtisanコマンドの作り方を解説しました。

この様なコマンドを追加するのが初めての場合は、難しいと感じるかもしれませんが、実際はコマンド1つでファイルが作成出来るのでとても簡単です。

外部APIを実行して定期的にデータを更新する必要がある場合などは、是非このArtisanコマンドで実装してみてください。

Sponsored Link
himakuro

himakuro

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

カテゴリー:
関連記事

コメントを残す