Laravel4、色っぽいArtisanコマンド

タグ: Laravel4  

これは、Laravel Advent Calendar 2013 の5日目の記事です。

あ〜に〜?…

あんだって?…

とんでもねぇ、ワシャ神様だよ、改め変なおじさん、川瀬です。

(いいんですよね。Laravel Advent Calendarは、こんなノリで…いいんだよな。他のアドカレほど真面目でなくても、いいんだよな…一人ぼっちにしないでね。)

4日目の「Model で Validation したい? それならば Ardent だ!」を書かれたマグナム・スーパー・エクステンデッド・ウルトラエディション開発者mkⅡのlocaldiskさんに引き続き、Aritisanコマンドの出力をカラフルにするTipを紹介します。(よさそな英単語つなげてみました。)

(本当に、この路線でいいんだな…Laravelアドカレは…)

Artisanコマンドは色が限られています。ドキュメントには出力色を変えるには、メソッドを使用するように書かれていますが、そのメソッド名と同じ奇妙な <info>...</info>タグを利用しても、着色可能です。しかし、この記法では意味は分かりますが、色が分かりません。ですから、端末に表示できる色を自由に定義できるようにしましょう。

ぶっちゃけると、エスケープシーケンスを流しこめば色は付くのですが、それじゃ原始的なので、もうちょっとおしゃれに行う方法です。

baseコマンドの作成

先ずベースコマンドを作成しましょう。今回の色追加だけでなく、共通に処理したいものはまとめておきましょう。

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;


class BaseCommand extends Command {

    public function run( InputInterface $input, OutputInterface $output )
    {
        // カラーの追加
        // $output->getFormatter()が定義されておらず、動かない。
        // そのため、新しいformatterを作成し、色を追加する。

        // 色付けするかどうかを渡す。--ansiの指定の反映。
        $formatter = new OutputFormatter( $output->isDecorated() );

        // 指定方法は見ての通り、ご自由にどうぞ。whiteもあります。
        $formatter->setStyle( 'red', new OutputFormatterStyle( 'red', 'black' ) );
        $formatter->setStyle( 'green', new OutputFormatterStyle( 'green', 'black' ) );
        $formatter->setStyle( 'yellow', new OutputFormatterStyle( 'yellow', 'black' ) );
        $formatter->setStyle( 'blue', new OutputFormatterStyle( 'blue', 'black' ) );
        $formatter->setStyle( 'magenta', new OutputFormatterStyle( 'magenta', 'black' ) );
        $formatter->setStyle( 'yellow-blue', new OutputFormatterStyle( 'yellow', 'blue' ) );

        $output->setFormatter( $formatter );

        // 親のrunメソッドを実行します。
        return parent::run( $input, $output );
    }
}

Symfonyのドキュメントを読まなくても、やっていることは理解できると思います。まあ、わかなくても、真似して書いてもらえばOKです。

ベースができましたので、実際にコマンドを作成しましょう。

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class ColorOutputCommand extends BaseCommand {

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'color:color';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'A sample color output.';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function fire()
    {
        $this->line('<green>爽やかな緑。</green>');
        $this->line('<yellow-blue>青地に黄色。</yellow-blue>');

        return 0;
    }

    /**
     * Get the console command arguments.
     *
     * @return array
     */
    protected function getArguments()
    {
        return array( );
    }

    /**
     * Get the console command options.
     *
     * @return array
     */
    protected function getOptions()
    {
        return array( );
    }

}

使い方もご覧の通り。定義した色を<...>で囲み、新しい色指定タグにします。それをlineメソッドで出力します。

なお、このphp artisan command:makeで生成されるスタブによるコードでは4.1で動作しないようです。(サービスプロバイダーからの登録は可能ですので、Command::registerからの登録がおかしいようです。もしかしたら、もう直っているかも知れません。この記事を書いている時点では、まだ4.1がリリースされていません。)

ちなみに、Artisanコマンドは--ansiをつけるとカラフルになり、つけていないデフォルトでは、白黒です。色がつかないで悩んでいる方は、オプションをお忘れなく。

さて、明日も私が書かせていただきます。ペジネーションのプレゼンテーションの切り替えという、ややかっこつけているタイトルですが、内容は、まあみなさんCSSフレームワークもお好きなわけで、かと言っていつもBootstrapばかり使うわけでもないでしょうから、Bootstrap以外でもペジネーションのリンク出力の生成を自分好みに変更する方法です。簡単に言うなら、自分の好きなCSSフレームワークのために、生成するHTMLを変更する方法です。