コマンドラインアプリケーション

Laravel5でターミナル端末から実行可能なコマンドラインアプリケーションを作成してみます。Laravelでは artisan を拡張することで、コマンドラインアプリケーションを実装します。


今回作成するコマンド

Userテーブルを検索しユーザ名の一覧を表示するコマンドを作成します。オプションの指定によって、件数だけを表示することも可能とします。

$ php artisan user:list
harry
ron
hermione

$ php artisan user:list --count
3

コンソールコマンドクラスの生成

artisanを使って、コンソールコマンドクラスを生成します。

php artisan make:console ListUser

app/Console/Commands/ListUser.php が以下の様に生成されます。

<?php  // app/Console/Commands/ListUser.php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ListUser extends Command
{
    protected $signature = 'command:name'; // ① 使用方法

    protected $description = 'Command description.'; // ② 説明

    public function __construct()
    {
        parent::__construct();
    }

    public function handle() // ③ メイン処理
    {
        //
    }
}

①使用方法:artisanで使用するコマンド名、引数、オプションを設定します
②説明:artisanのヘルプで表示される説明を記述します
③メイン処理:このコマンドのメイン処理を記述します


使用方法の設定

コマンド名、引数、オプションを文字列で指定します。

protected $signature = 'command:name {argument} {--option}'

引数やオプションは以下のように記述できます。

// 引数(必須)
command:name {argument}

// 引数(任意)
command:name {argument?}

// 引数(初期値)
command:name {argument=default}

// オプション(true)
command:name {--option}

// オプション(値を受け取る)
command:name {--option=}

// オプション(値を受け取る or 初期値)
command:name {--option=default}

引数やオプションに説明を付けることもできます。

protected $signature = 'command:name
                        {argument : 引数の説明}
                        {--option : オプションの説明}';

今回作成するコマンドでは、以下のように設定します。

class ListUser extends Command
{
    protected $signature = 'user:list {--count : ユーザー数のみ表示する}';
    
    // ...
}

説明の設定

コマンドの説明を記述します。

protected $description = 'ユーザ一覧を表示する';

メイン処理

handle()メソッドを以下のように実装します。

...
use App\User; // 追加

class ListUser extends Command
    ...

    public function handle() // メイン処理
    {
        if ($this->option('count')) { // ①
            $this->countUser();
        } else {
            $this->listUser();
        }
    }

    private function countUser() // ユーザー件数表示
    {
        $this->info(User::count()); // ②
    }

    private function listUser() // ユーザー一覧表示
    {
        User::all()->each(function($user) { // ③
            $this->info($user->name);
        });
    }

① ‘count’ オプションの入力有無で、処理を振り分けます。
② ユーザ件数を取得し表示します。
③ 全ユーザを取得し、名前を表示します。

# 引数、オプションの取得

以下のように行います。

// 引数の取得
$foo = $this->argument('foo');

// 全引数を配列で取得
$args = $this->argument();

// オプションの取得
$bar = $this->option('bar');

// 全オプションを配列で取得
$options = $this->option();

# 画面への情報出力

以下のように行います。

$this->info('Display this on the screen'); // 情報の出力

$this->error('Something went wrong!'); // エラーの出力

コマンドの登録

app/Console/Commands/Kernel.php に生成したコマンドクラスを登録します。

<?php  // app/Console/Kernel.php

namespace App\Console;

// ...

class Kernel extends ConsoleKernel {
    protected $commands = [
        \App\Console\Commands\ListUser::class, // 追加
    ];

    // ...
}

artisan を実行して、コマンドが登録されたか確認します。

$ php artisan

Usage:
 command [options] [arguments]

...
user
  user:list            ユーザ一覧を表示する
...

コマンドと説明が表示されました。

helpの表示も確認します。

$ php artisan help user:list
Usage:
  user:list [options]

Options:
      --count           ユーザー数のみ表示する
...

最終的なソース

<?php // app/Console/Commands/ListUser.php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\User;

class ListUser extends Command
{
    protected $signature = 'user:list {--count : ユーザー数のみ表示する}';

    protected $description = 'ユーザ一覧を表示する';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        if ($this->option('count')) {
            $this->countUser();
        } else {
            $this->listUser();
        }
    }

    private function countUser()
    {
        $this->info(User::count());
    }

    private function listUser()
    {
        User::all()->each(function($user) {
            $this->info($user->name);
        });
    }
}

実行

以上で実装は完了です。以下のように動けば成功です。

$ php artisan user:list
harry
ron
hermione

$ php artisan user:list --count
3

まとめ

コマンドラインアプリケーションを作成出来るようになりました。今回はツール的な物を作成しましたが、同様の方法でバッチ処理も作成できます。


その他

今回説明していないもの

  • 画面に質問を表示して入力値を取得する
  • 他のコマンドを呼び出し

詳細は公式サイトをご覧ください。
http://laravel.com/docs/5.1/artisan

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中