2016-04-23

Laravel で独自コマンドを作成する方法

Laravelは本当に利用がしやすく誰にでもおすすめができるのですが、その理由のひとつ
として「自分の好きなコマンドを独自に作成することができる」というものが挙げられるかと思います。

コマンド。
そう、あまり windows ユーザーの方は馴染みがないかもしれませんが、cron が利用して定期的にプログラムを起動するといった用途に使えるととても便利な機能です。

※たしか windows 10 で Ubuntu が使えるようになる(った?)のでこれからはコマンドも windows ユーザーには馴染みのあるものに成るかもしれませんね。


ということで、今回はLaravel 5 を例に独自コマンドを作成する方法をご紹介したいと思います。




【準備】

では、まずターミナルを開いてLaravelがインストールしてあるフォルダまで移動してください。
そして、独自コマンドから起動するPHPファイルを作成します。
以下のコマンドを打ち込んで実行してください。
(TestCommandの部分はお好きな名前が使えます。)

php artisan make:console TestCommand

実行すると「Console command created successfully.」というメッセージが出て以下にひな形のファイルが自動で作成されています。
 app/Console/TestCommand.php

【コマンドファイルの作成】

ファイルを開くと「TestCommand」というクラスが書かれていて、中にいくつかのメンバ変数やメソッドなどが書かれていると思います。

ここで変更する点は以下の3点です。

  1. $signature
  2. $description
  3. handle()

ではひとつずつ見て行きましょう。

1.$signature

$signature は実際にどんなコマンドを使いたいかを設定します。
例えば、E-Mail を定期的に送信するプログラムを起動したい場合は以下のようにすればいいでしょう。

protected $signature = 'cron:email';

コロン「:」をつけておくとコマンドの一覧を確認する際に大ジャンル、少ジャンルのようにリスト表示してくれて見やすいので付けられる場合はぜひつけておきましょう。

cron
  cron:email
  cron:test
db
  db:seed

はい。
これでコマンド「php artisan cron:email」というコマンドが利用できるようになります。(実際には登録がまだなので実行はできません。もし先に登録したい場合は一番最後の項目「コマンドの登録」へ移動してください。)


2.$description

$description はそのままでコマンドの説明分です。
後で「あれ?どんなコマンドだったっけ?」なんてこともたまにはあるので、ぜひ登録しておきましょう。説明文はコマンド一覧から読むことができます。

protected $description = 'Send email to users';


3.handle()

public function handle(){  } の中にはコマンド実行した時に呼ばれるプログラムになります。
つまり心臓部分ですね。
メールを送信する、データをスクレイピングしてとってくるなどお好きな使い方をしてください。


なお、もしかするとコマンドに値を渡したい場合があるかもしれません。
例えば、

  • メールを最大10件だけ送信したい
  • 日本人ユーザーだけにメールを送信したい

そんな場合は 「argument」と「option」が利用できます。
まずは argument から。

例えばこんなカンジでコマンドを利用したい場合です。

(10件だけ送信) 
php artisan cron:email 10

$signature に

protected $signature = 'cron:test {count}';

と、{オプション名}をつけるだけでhandle()内で以下のように値を受け取れます。

$count = $this->argument('count');

ただし、この場合は必ず引数を指定しないとエラーが発生します。
もし値を任意にしたい場合は、以下のように?をつけるといいでしょう。

protected $signature = 'cron:test {count?}';

また、デフォルト値を指定したい場合はこうなります。

protected $signature = 'cron:test {count=50}';


では、次に「option」です。
option も先ほどと似ていて、基本の形はこうなります。

protected $signature = 'cron:test {--country}'


ただし、この場合は「値をとらない場合」になります。
つまり、

php artisan cron:test --country=japan

という形では利用できず、

php artisan cron:test --country

という形で、値としては true/false を受け取ることになります。
ですので、使い方としては以下のような形がいいでしょう。

if($this->option('country')) {
   echo 'Yes!';
}


では、値を渡したい場合はというと、「=」をつけて上げることで実現できます。

protected $signature = 'cron:test {--country=}';

値は、

echo $this->option('country');

として受けることができます。

同じくデフォルト値が必要な場合は

protected $signature = 'cron:test {--country=canada}';

とします。


コマンドの登録

では、最後に作成したコマンドを実際に使えるよう登録しましょう。
変更するファイルは以下になります。
app/Console/Kernel.php
このファイルの中の $commands という変数へ先ほどのコマンドを追加します。

実際にはこんなカンジです。

protected $commands = [
    \App\Console\Commands\Inspire::class,
    \App\Console\Commands\TestCommand::class,
];

※一つめの値は始めから記述されているものになります。

はい。
これでコマンドラインから実行ができるようになりました。
まず、一覧に表示されているかを確認してみましょう。

php artisan

おそらく

 cron
  cron:test             Send email

という形で表示がされていると思います。

では!
実際にあなたの独自コマンドを実行してみましょう。

php artisan cron:test

handle() に書かれたプログラムが実行できるのを確認できるはずです。


なお、コマンドに文字を表示するには echo() でも問題ありませんが、以下を利用すると見やすいので一度試してみてもいいかもしれません。

  • $this->line('テキスト');
  • $this->info('テキスト');
  • $this->error('テキスト');
上から、通常のテキスト、色付きテキスト、背景が赤のテキストとなります。


と今回はLaravelの独自コマンド作成をお届けしました。
皆さんのお役にたてれば幸いです(^^)







0 件のコメント:

コメントを投稿