バッチのタスクでデータベースを使う場合
symfony1.0系とそれ以降の違いで大きなものの1つがバッチ処理の管理方法です。
1.0系ではバッチ用のコントローラーをbatchディレクトリに作成していましたが、1.1系以降ではタスク(コマンド)で管理します。
もちろん、初期化コマンドが用意されているのでgenerate:taskにネームスペースとタスク名をわたすだけでOKです。
$ ./symfony generate:task batch:taskname
で、タスクの中でDBアクセスを行う場合は、本家では
$databaseManager = new sfDatabaseManager($this->configuration);
を記述するように書かれていますが、
ref: http://www.symfony-project.org/blog/2008/06/14/batches-are-dead-long-life-to-tasks
このまま記述してタスクを実行しても次のようなエラーになります。
$ ./symfony batch:taskname PHP Catchable fatal error: Argument 1 passed to sfDatabaseManager::__construct() must be an instance of sfApplicationConfiguration, instance of ProjectConfiguration given,
原因はアプリケーション名を指定していないからでした。
生成されたタスクファイルの以下の行をコメントアウトを外し、アプリケーション名をオプションで必ず渡すようにします。
$this->addArgument('application', sfCommandArgument::REQUIRED, 'The application name');
これで、
$ ./symfony batch:taskname admin
のようにアプリケーション名を渡すことでデータベースアクセスが正常にできました。
よく考えてみれば当たり前だけどハマった。