Más con Symfony

13.2. Creando tus propias tareas

Empezar a crear tareas de Symfony cuesta muy poco tiempo. Lo único que debes hacer es crear una tarea, darle un nombre, añadir algo de código y ya puedes ejecutar tu propia tarea. Vamos a crear una tarea muy sencilla de tipo ¡Hola Mundo! en un archivo llamado lib/task/sayHelloTask.class.php:

class sayHelloTask extends sfBaseTask
{
  public function configure()
  {
    $this->namespace = 'say';
    $this->name      = 'hello';
  }

  public function execute($arguments = array(), $options = array())
  {
    echo '¡Hola Mundo!';
  }
}

Ahora ya puedes ejecutar la tarea con el siguiente comando:

$ php symfony say:hello

Esta tarea simplemente muestra ¡Hola Mundo!, pero recuerda que acabamos de empezar. Las tareas no están pensadas para mostrar sus mensajes mediante instrucciones echo o print sencillas. Las tareas heredan de la clase sfBaseTask, por lo que tienen a sus disposición un montón de métodos útiles, incluyendo el método log() encargado de mostrar mensajes e información:

public function execute($arguments = array(), $options = array())
{
  $this->log('¡Hola Mundo!');
}

Como la ejecución de una tarea puede derivar en la ejecución de varias tareas diferentes que a su vez muestran mensajes, es recomendable utilizar el método logSection() al mostrar mensajes:

public function execute($arguments = array(), $options = array())
{
  $this->logSection('say', '¡Hola Mundo!');
}

Al método execute() de las tareas siempre se le pasan dos parámetros llamados $arguments y $options. Se de las variables que guardan todos los parámetros y todas las opciones que se pasan al ejecutar una tarea. Más adelante se explican con detalle los argumentos y las opciones, pero ahora vamos a hacer la tarea un poco más interactiva permitiendo que el usuario especifique la persona a la que queremos saludar:

public function configure()
{
  $this->addArgument('who', sfCommandArgument::OPTIONAL, '¿A quién quieres saludar?', 'Mundo');
}

public function execute($arguments = array(), $options = array())
{
  $this->logSection('say', '¡Hola '.$arguments['who'].'!');
}

Ahora, cuando se vuelve a ejecutar la tarea:

$ php symfony say:hello Geoffrey

Se muestra un mensaje diferente:

>> say       ¡Hola Geoffrey!

Como añadir un argumento ha sido muy sencillo, vamos a incluir en la tarea algo de metainformación, como por ejemplo la descripción de su propósito. Para ello, utiliza las propiedades briefDescription y description:

public function configure()
{
  $this->namespace           = 'say';
  $this->name                = 'hello';
  $this->briefDescription    = 'Hola Mundo sencillo';

  $this->detailedDescription = <<<EOF
La tarea [say:hello|INFO] es una implementación del clásico ejemplo
Hola Mundo utilizando el sistema de tareas de Symfony.

  [./symfony say:hello|INFO]

Puedes utilizar esta misma tarea para saludar a alguien mediante el
argumento [--who|COMMENT].
EOF;

  $this->addArgument('who', sfCommandArgument::OPTIONAL, '¿A quién quieres saludar?', 'Mundo');
}

Como puedes ver, la descripción de la tarea se puede decorar un poco mediante una sintaxis especial. Comprueba el resultado haciendo uso de la ayuda de las tareas de Symfony:

$ php symfony help say:hello