How to launch a symfony task from action code? Ou comment appeler une tâche symfony depuis une action, sans passer par le CLI ?
Symfony permet depuis la version 1.3 / 1.4 d’appeler une tâche directement depuis une autre tâche via le code suivant :
$this->runTask('mydomain:mytask');
On peut par exemple très facilement créer une tâche au cours de laquelle un appel à symfony cc sera déclenché :
<?php class testTask extends sfBaseTask { protected function configure() { // // add your own arguments here // $this->addArguments(array( // new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'), // )); $this->addOptions(array( new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'), new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'), new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'doctrine'), // add your own options here )); $this->namespace = ''; $this->name = 'test'; $this->briefDescription = ''; $this->detailedDescription = << The [test|INFO] task does things. Call it with: [php 1="test|INFO" language="symfony"][/php][/php] EOF; } protected function execute($arguments = array(), $options = array()) { // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); // here is our code // we do something // and we clear cache $this->runTask('cc'); } }
En revanche, rien n’est actuellement prévu pour appeler cette même tâche depuis une action. Il est pourtant très utile de pouvoir appeler la tâche d’envoi des emails directement depuis une action de son backend. Ou même de vider le cache sans avoir à passer par la ligne de commandes.
Le plugin ybRunTaskPlugin a été développé justement pour palier à ce manque. Une fois le plugin installé, il est possible d’appeler directement au sein de son action une tâche symfony, de la même manière qu’on pouvait le faire en standard au sein d’une autre tâche :
class myActions extends sfActions { public function executeRuntask(sfWebRequest $request) { $ret = $this->runTask('myDomain:myTask', 'myArguments'); if(null != $ret) { $this->msg = $ret->getMessage(); } else { $this->msg = 'everything went OK'; } } }
Malheureusement, le plugin ne gère actuellement pas l’affichage des logs ou d’une quelconque valeur de retour si l’exécution s’est passé correctement. Peut-être dans une prochaine version ?
En attendant, vous pouvez réaliser un petit hack du plugin en fonction de vos besoins…
a quoi correspond « myDomain » dans $this->runTask(‘myDomain:myTask’, ‘myArguments’);
Bonjour,
Les tâches symfony sont classées dans différentes catégories telles que « generate », « plugin », etc. La liste complète est disponible ici : http://www.symfony-project.org/reference/1_4/fr/16-Tasks
La tâche « symfony cc » est en fait un raccourci pour le domaine « cache » et la tâche « clear » qui s’appelle donc en ligne de commande comme ceci : « php symfony cache:clear ».
Tout simplement…
Bonjour,
ok merci pour ta précisison.
De plus, je souhaitais exécuter une tâche plusieurs fois dans une boucle mais on voit bien que les taches ne sont pas faites pour être utilisées dans le model. En fait dans mes log je vois que le 2ème appel de « runTask » exécute deux fois la tache, le 3ème appel trois fois, …) mon code :
chdir(sfConfig::get(‘sf_root_dir’));
foreach ($listeAnnonceurs as $key => $value) {
$this->runTask(‘creeFlux’, array(‘myArg’, 20));
}
Donc pour une tache c’est cool mais sinon il faut trouver une autre solution (batch, …)
et c’est pas le plugin qui est en cause puisque j’ai essayé avec la méthode : http://brentertainment.com/2010/02/15/run-a-symfony-task-from-your-model-or-action/ ce qui donne le même résultat.