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を変更する方法です。