Más con Symfony

13.9. Ejecutando una tarea dentro de otra tarea

Otra forma alternativa de refactorizar las tareas consiste en incluir una tarea dentro de otra. Esta técnica es muy sencilla gracias a los métodos sfCommandApplicationTask::createTask() y sfCommandApplicationTask::runTask().

El método createTask() crea una instancia de la tarea indicada. Si se pasa el nombre de una tarea como si se ejecutara en la línea de comandos, este método devuelve una instancia de esa tarea lista para ejecutarla:

$task = $this->createTask('cache:clear');
$task->run();

Si no tienes muchas ganas de trabajar, el método runTask() puede hacerlo todo a la vez:

$this->runTask('cache:clear');

También es posible pasar argumentos y opciones (en este orden):

$this->runTask('plugin:install', array('sfGuardPlugin'), array('install_deps' => true));

Embeber unas tareas dentro de otras es muy útil para crear tareas complejas a partir de tareas más sencillas. Se pueden combinar por ejemplo varias tareas en una gran tarea llamada project:clean y que se ejecute después de cada instalación:

$tasks = array(
  'cache:clear',
  'project:permissions',
  'log:rotate',
  'plugin:publish-assets',
  'doctrine:build-model',
  'doctrine:build-forms',
  'doctrine:build-filters',
  'project:optimize',
  'project:enable',
);

foreach($tasks as $task)
{
  $this->run($task);
}