symfonyのタスクでデータベースを自動で選ぶようにする

symfony 1.3からDoctrineがデフォルトのORMになり、これに伴ってタスクのデフォルトのコードに「doctrine」という文字が埋め込まれるように変更されました。つまり、自前で作成したタスクをデータベースオプションを指定せずに実行した場合、「doctrine」という名前のデータベースが使われます。

ここで言う「doctrine」という名前は、実際はdatabase.ymlファイルで指定したデータベース接続設定の名前です。
ですので、ORMにDoctrineを使うという意味ではありません。
(タスクのオプションの名前も、ORMではなくてconnectionですしね)


このデータベース接続名は、デフォルトのまま使っている場合は「doctrine」または「propel」ですが、何らかの理由で接続名を変更している場合があるかもしれません。そういったプロジェクトの場合、生成したタスクごとにデフォルト値を書き換えるといった作業が必要になってしまい、やや面倒です。

※特にsymfony 1.3/1.4でPropelを使っている場合は・・・(タスク側はデフォルトでdoctrineになっている)
※タスク生成時のオプションで接続名を指定すれば、それがデフォルト値に設定されます。


そこで、「database.ymlに記述されている先頭の接続をデフォルトで使用する」ように変更してみます。

といっても、非常に単純ですが・・・・。生成されたデフォルトタスクで以下の部分を書き換えます。
■connectionオプションのデフォルト値を削除

<?php
$this->addOptions(array (
    new sfCommandOption('application', null, sfCommandOption :: PARAMETER_REQUIRED, 'The application name'),
    new sfCommandOption('env', null, sfCommandOption :: PARAMETER_REQUIRED, 'The environment'),
    new sfCommandOption('connection', null, sfCommandOption :: PARAMETER_REQUIRED, 'The connection name'),
    // add your own options here
    ));

■execute内の接続の初期化コードを次のように変更

<?php
$databaseManager = new sfDatabaseManager($this->configuration);
$database = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : array_shift($databaseManager->getNames()));
$connection = $database->getConnection();

これで、database.ymlに設定した先頭のデータベース接続が自動的に使われます。


ちなみにこのように書いておくと、ORMがDoctrineのプロジェクトでもPropelのプロジェクトでも、タスクのコードを書き換えることなく、また、タスクの実行オプションに接続名を指定することなく、1つのタスクを同じように実行できるというメリットもあります。

(といっても、データベース処理を行うタスクの場合は結局どちらかのORMに依存してしまう可能性が高いですが)


※なので、symfonyが生成するタスクのデフォルトコードがこのようになっていてもいいんじゃないかと思ったり思わたなったり・・・。