アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

symfony1.2でカスタムタスクを作成してみる

こんにちは。松田です。
先日symfony1.2のタスクを作る機会があったので、その過程と作りかたをまとめておきます。symfonyでいうタスクとは、「symfony generate:module」などのsymfony独自のコマンドのことです。

作成方法としては、sfBaseTaskを継承したクラスを作成しlib以下に置くだけで完成ですが、この雛形作成の処理もタスクで行うことができます。
今回はテスト用に「asial:test」タスクを作ってみます。


./symfony generate:task asial:test


すると、lib/taskディレクトリが自動的に作られ、中にasialTestTask.class.phpが作成されます。基本はこれだけで完成で、symfonyコマンドを打ってみるとタスクの一覧に表示されているのが確認できると思います。



./symfony





次に、タスクを呼び出した際に実行する処理を記述します。
生成されたクラスファイルを開いてみると、configure()とexecute()メソッドの2つが記述してあるので、execute()のほうに処理を記述することになります。
ありきたりですが、とりあえずHelloWorldを出しておきます。


protected function execute($arguments = array(), $options = array())
{
  // initialize the database connection
  $databaseManager = new sfDatabaseManager($this->configuration);
  $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();

  // add your code here
  echo "Hello World!\n";
}



これで実行できるタスクの完成です。
早速実行してみましょう。


./symfony asial:test



あれ?エラーが出てしまいました。
どうやら初期状態でDBを使う設定になっているようです。
「generate:task」には「--use-database」というオプションがあるのですが、これを指定してはじめてDBが使えるようになるかと思いきや、明示的に「--use-database=false」を指定しないと勝手に'propel'が設定されるという実装のようです。
わかりづらっ


とりあえずexecute()の前半3行ぐらいのDBに接続しようとしている部分を消してして実行します。


protected function execute($arguments = array(), $options = array())
{
  echo 'Hello World!';
}



./symfony asial:test


無事実行できました!


タスクに引数を設定するには、configure()内でaddArgument()を行います。


$this->addArgument('var1', sfCommandArgument::REQUIRED, 'this is var1');
$this->addArgument('var2', sfCommandArgument::REQUIRED, 'this is var2');

コマンドで指定された引数は、execute()内では$arguments配列から使用することができます。


./symfony asial:test 111 222

上記の場合、$argument['var1']には111、$argument['var2']には222が入ります。


ちなみに、タスク内でDBモデルを使用する場合は、先ほど消した部分を元に戻し、15行目のconnectionを設定することになります。
設定する文字列はconfig/databases.ymlの以下の部分の名称です。


all:
  testdb: //←これを
    class:
    param:
      dsn:



new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'testdb'), //←ここに




また、これらsymfonyのタスクは、他のタスク内からも呼び出すことができます。


// タスク内から他のタスクを呼び出す
$task = new asialTestTask($this->dispatcher, $this->formatter);
$task->run($arguments);


action内からもタスクを呼び出すことができますが、内部実装がアレなため、ちょっとだけ工夫が必要です。
>>JS
// アクション内からタスクを呼び出す
chdir(sfConfig::get('sf_root_dir')); // ←これが必要
$task = new asialTestTask($this->dispatcher, new sfFormatter());
$task->run($arguments);