社畜系WEBエンジニアの消耗戦

読者です 読者をやめる 読者になる 読者になる

社畜系WEBエンジニアの消耗戦

修羅の国でせっせと働く社畜系WEBエンジニアのブログ

Laravelでartisanコマンドを独自定義してCLI処理を書く

定常作業だけだとつまらないので、そのつまらない作業をやらなくてよくなるように、LaravelでCLIツールを作ろうと思い立ちました。声高らかにやります宣言をしちゃうと追い込まれるので、「なんかアイツが勝手に作った」くらいのテンションでやっていく所存。

月内のすべての定常業務を一時間以内で出来るようになれば後の時間はハッピーライフ。

参考文献

コンソールコマンド 5.3 Laravel

なんだかんだで公式ドキュメントが一番参考になる罠。

Commandクラスの作成

これで作成。

php artisan make:command WelcomeCommand

作成したらコマンド名前を設定します。group:name形式にすることで、グルーピングも可能。また、引数、オプションの説明を加えるとヘルプでいい感じにやってくれるので、可能ならば書いておこう(後述)。

<?php
protected $signature = 'welcome';

artisanコマンドに登録

Kernel.phpに先程作成したクラスをネームスペース付で入れればOK。

<?php
protected $commands = [
    'App\Console\Commands\WelcomeCommand'
];

ここまでできれば、実行できます。

$ php artisan welcome

処理を書く

呼び出すとhandleメソッドが実行されるので、そこに処理を書いていきます。

<?php
public function handle()
{
    // ここに処理を書く
}

Hello World

公式ドキュメントを参考にしつつ、とりあえず入力値を表示するHello World的なやつを書いてみました。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class WelcomeCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'welcome
                            {firstName : The firstName of the user}
                            {lastName : The lastName of the user}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'CLI tool test command';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $name = $this->arguments();
        $this->info("Welcome, " . $name['firstName'] . " " . $name['lastName'] . "!!");
    }
}

ヘルプもばっちり。

$ php artisan welcome -h
Usage:
  welcome <firstName> <lastName>

Arguments:
  firstName             The firstName of the user
  lastName              The lastName of the user

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  CLI tool test command

実行はこんな感じ。

$ php artisan welcome kenichiro watanabe
Welcome, kenichiro watanabe!!

引数が足りなかったらException。これExceptionそのまま出すのもあれなんだけど、なんかコールバック仕込めないのかな?独自のエラーメッセージ書きたい。

$ php artisan welcome nabeen

  [Symfony\Component\Console\Exception\RuntimeException]
  Not enough arguments (missing: "lastName").

とりあえず、以上!