symfony1.1のtaskの作り方・使い方

symfony1.0ではinit-batchでCLI処理を作っていましたが、1.1ではtaskというのが導入されたようです。ブログで書かれていたチュートリアルを見ながら試してみます。バージョン1.1のCookbookにもこの解説は入るようです。

symfonyコマンドが元々呼び出せるタスク群(symfony generate:moduleとか)と同じように自分の作ったタスクを登録し、symfonyコマンドから呼び出すことができます。

$ symfony generate:task akky:hello-world

これで、akky:hello-worldという新タスクが登録されます。

symfonyコマンドを実行すると、タスクの一覧にもこのakky:hello-worldが出てきます。実行も既存タスクと同じで、

$ symfony akky:hello-world

このタスクの本体は、lib/task/akkyHelloworldTask.class.php にできています。

この生成されたコードの中に、タスクのヘルプを書いたりタスクが受け取れるパラメータを指定したり、そしてタスクの本体処理を書けます。

protected function execute($arguments = array(), $options = array())
{
// add code here
echo 'hello, world';
}

これで実行すると、symfonyコマンドからhello, worldを出力させることができました。

パラメータの受け取り方の詳細や、タスクから他のタスクを呼ぶ方法、環境に応じた処理の切り分け方法などは、元のブログ記事をどうぞ。

あと、generate:taskで作成はわかったけど、作ったタスクを消すにはどうするの、と該当するsymfonyコマンドが見当たらなくて迷ったのですけど、taskファイルを消してしまえばいいみたいです。

symfony1.1のアーキテクチャ解説

Fabienさんによる図入りのアーキテクチャ解説が出てます。

symfony1.1では、クラスとクラスの間の依存関係が減らされて(decoupled)います。YAML操作とかForm処理、データベースアクセスやキャッシュなどのクラスはそれぞれが単体でも呼び出せるようになっていて、そのためには


require_once '/path/to/sfCoreAutoload.class.php';
sfCoreAutoload::register();

の2行を書くだけ。あとはsymfonyのオートローダがよしなにやってくれます。これらがsymfony プラットフォーム

真ん中の方の図にあるように、MVCフレームワークを構成しているクラス群は、symfonyプラットフォームのクラスを必要に応じて呼び出しているけれども、symfonyフレームワークのMVCを使わずに、symfonyプラットフォームの便利なクラスだけを使うこともできるし、使わないものは使わない、そう、YahooがDel.icio.us2.0でsymfonyは採用したけどpropelは採用しなかったように、柔軟に選択することができる、ということになります。

バージョン1.1では、クラス間の依存関係をZend Framework以上にde-coupleした、と言っています。

symfony is one of the most decoupled framework available in PHP, even more than the Zend Framework

Zend Frameworkと比べ、いやいや、たとえば、symfony1.1のsfFormは、ビューやコントローラから切り離しにくいZend_Formよりも、より単独でMVCを絡ませずに使うこともできる、ということです。