./console --shellを拡張してみた

早速なので、仕事であまり時間がないけどちょっと触ってみました。

Symfony2からは各アプリケーション毎にconsoleコマンドがあり、以前でいうsymfonyコマンドのようです。
また、インタラクティブシェルも用意されており、--shellオプションで起動できます。*1

で、このシェルを拡張する方法を試してみました。

拡張したいファイルをコピーしnamespaceを書き換える

今回利用したファイルはGitHub - noelg/symfony-demo: A shopping cart application built with Symfony 2です。
symfonyのドキュメントにあったAJAXを使ったショッピングカートのSymfony2実装版です。
動作させるために必要なのはPHP5.3の環境とgit cloneしたファイルです。

主なディレクトリ構成は以下のようになっていました。

./web => 公開ディレクトリ(コントローラー, 画像, css, js等)
./cart => cartの設定ファイル関連
  * console ... Symfony2コンソールコマンド
./src
  ./Bundle
    ./CartBundle => cartバンドルのファイル群
      ./Controller
      ./Model
      ./Resources
  ./vender
    ./symfony
      ./src
        ./Symfony => Symfony2のコアファイル群
          ./Compornents
          ./Foundation
          ./Framework
            ./WebBundle => Webバンドル
              ./Controller
              ./Resources
              ./Console
              .... 他多数

これまでモジュールと呼んでいた単位がバンドルという名称で呼ばれているようです。
モジュール単位ではなくプロジェクト単位のようです。
そして、Webバンドルというものがコアに存在しconsoleコマンドはこのConsoleにあるファイルを使っていました。
そこで、自分のバンドル内にコアファイルで利用しているファイルをコピーしてきました。

/src/vendor/symfony/src/Symfony/Framework/WebBundle/Consoleを
/src/Bundle/CartBundl/Consoleにコピーし、コピーしたファイルのnamespaceをコピー先のパスに書き換えます

// namespace Symfony\Framework\WebBundle\Console; // 旧
namespace Bundle\CartBundle\Console; // 新

そして、拡張したい内容をコーディングします。

アプリケーションのconsoleコマンドファイルのuseを書き換える

consoleコマンドファイルを開きuseを拡張したnamespaceに置き換えます。

//use Symfony\Framework\WebBundle\Console\Application; // 旧
use Bundle\CartBundle\Console\Application; // 新

namespaceのおかげで拡張するクラス名やメソッド名は一切変更していません。変えたのは名前空間と実装部分のみです。
sfという接頭辞ももう見なくなっちゃいますね。

さて、拡張した結果以下のようにしんふぉにゃんを出すことだって簡単に...

しんふぉにゃんについてはsymfonyの非公式マスコットが作成されたようです - モノノフ日記
AA作成についてはASCII Art Generator - Make your picture into textを利用させていただきました。

*1:このオプションを利用するためにはPHPが--with-readlineでコンパイルされている必要があります。