Lancer une tâche symfony depuis une action

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 &#91;test|INFO&#93; task does things.
Call it with:
&#91;php 1="test|INFO" language="symfony"&#93;&#91;/php&#93;&#91;/php&#93;
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…

Publié par Olivier Balais

Jeune ingénieur logiciel basé à Lyon (@overnetcity) passionné par les NTIC et le développement Web, je suis actuellement salarié chez Reputation VIP et effectue en parallèle des missions ponctuelles en temps que Freelance. Passionné depuis toujours par l'informatique et le développement, suite à une formation solide à l'INSA de Lyon, je me suis spécialisé dans la réalisation de bout en bout de projets web complexes.

Rejoindre la conversation

3 commentaires

  1. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *