Task2. タスクとは? Symfony で作る CLI アプリです。 デフォルトでたくさんのタスクが用意されています。 $ ./symfony Available tasks: :help Displays help for a task :list Lists tasks app :routes Displays current routes for an application cache :clear Clears the cache (cc) : : : 3. タスクの作り方① <?php class SampleTask extends sfBaseTask { protected function execute($arguments = array(), $options = array()) { echo "Hello, World!"; } } $ ./symfony sample Hello, World! ファイル名は○○ Task.class.php /lib/task/ 配下に置く sfBaseTask を継承 「 symfony ○○ 」で実行できる 5. タスクの作り方② $ ./symfony generate:task myapp:sample ※ myapp =ネームスペース ※ sample =タスク名 $ ./symfony myapp :sample $ ./symfony myapp:sample class myappSampleTask extends sfBaseTask { protected function configure() { $this->namespace = 'myapp'; $this->name = 'sample'; } protected function execute($arguments = array(), $options = array()) { } } 6. ヘルプを付ける protected function configure() { $this->briefDescription = ' サンプルアプリ '; $this->detailedDescription = ‘ これは [ サンプル |INFO] の [ アプリ |COMMENT] です。’ ; } $ ./symfony myapp :sample サンプルアプリ $ ./symfony --color help myapp:sample Usage: symfony myapp:sample Description: これは サンプル の アプリ です。 7. コマンドライン引数の受け取り方 <?php class SampleTask extends sfBaseTask { protected function configure() { $this->addArguments(array( new sfCommandArgument('arg1', sfCommandArgument::REQUIRED, ' 引数1の説明 '), new sfCommandArgument('arg2', sfCommandArgument::OPTIONAL, ' 引数2の説明 ', ' 初期値 '), )); } protected function execute($arguments = array(), $options = array()) { echo $arguments['arg1']; } } ------------------------- $./symfony help sample Usage: symfony sample arg1 [arg2] Arguments: arg1 引数1の説明 arg2 引数2の説明 (default: 初期値 ) 8. コマンドラインオプションの受け取り方 <?php class SampleTask extends sfBaseTask { protected function configure() { $this->addOptions(array( new sfCommandOption('opt1', 'O', sfCommandOption::PARAMETER_REQUIRED, ' オプション1の説明 '), new sfCommandOption('opt2', null, sfCommandOption::PARAMETER_OPTIONAL, ' オプション2の説明 ', ' 初期値 '), )); } protected function execute($arguments = array(), $options = array()) { echo $options['opt1']; } } ------------------------- $ ./symfony help sample Usage: symfony sample [-O|--opt1="..."] [--opt2[="..."]] Options: --opt1 (-O) オプション1の説明 --opt2 オプション2の説明 (default: 初期値 ) 9. 終了コードと例外処理 ◆ 終了コード execute メソッドの return 値が、 CLI アプリの終了コードになる。 成功 0 失敗 0 以外 ◆ 例外 throw new sfCommandException(' エラーです! ', 100); catch はフレームワーク側でしてくれる。 例外発生時の終了コードは Exception::getCode() の値 10. ログの出し方 protected function execute($arguments = array(), $options = array()) { $this->log('hogehoge'); $this->logSection('init', 'hogehoge'); $this->logSection('proc', 'hogehoge'); $messages = array('hoge', 'hogehoge', 'hogehogehoge'); $this->logBlock($messages, 'INFO'); } $ ./symfony sample hogehoge >> init hogehoge >> proc hogehoge hoge hogehoge hogehogehoge なぜ echo や print ではだめなのか? -> ログも event で実現しています 11. DB アクセスの仕方 protected function execute($arguments = array(), $options = array()) { $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase(' 接続名 ')->getConnection(); $member = Doctrine::getTable('Member')->find(1); $this->log($menber->getName()); } 12. Web アプリリソースへのアクセス方法 コンフィグ& ルーティング ------------------------- protected function configure() { $this->addOptions(array( new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, ' アプリ名 '), new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, ' 環境名 ', 'dev'), )); } $this->log(sfConfig::get('app_name')); $ symfony myapp:sample --application=frontend --env=dev ------------------------- $routing = $this->getRouting(); $this->log($routing->generate('homepage')); $this->log($routing->generate('default', array('module' => 'Login', 'action' => 'login'))); $ symfony myapp:sample --application=frontend --env=prod / /Login/login 13. その他 こんなのもあります。 ◆ メール送信 $this->getMailer() project:send-emails タスク ◆ 入力 $this->ask() $this->askConfirmation() $this->askAndValidate() ◆ ファイル操作 sfFilesystem ◆ タスクの起動 $this->runTask()