El tutorial Jobeet

11.10. Tareas de mantenimiento

Aunque Symfony es un framework para desarrollar aplicaciones web, también incluye una herramienta para la línea de comandos. Esta herramienta ya la has utilizado para crear la estructura inicial de directorios del proyecto y de la aplicación y también para generar las clases del modelo de datos. Crear una nueva tarea es muy sencillo, ya que todas las herramientas necesarias se incluyen en el framework.

Cuando un usuario crea una nueva oferta de trabajo, es necesario que la active para que se publique en la web. Si no se activan las ofertas, la base de datos puede contener en poco tiempo muchas ofertas de trabajo inactivas. Por tanto, vamos a crear una tarea que elimina todas las ofertas de trabajo inactivas de la base de datos. Además, ejecutaremos esta tarea de forma periódica mediante una tarea programada.

// lib/task/JobeetCleanupTask.class.php
class JobeetCleanupTask extends sfBaseTask
{
  protected function configure()
  {
    $this->addOptions(array(
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environement', 'prod'),
      new sfCommandOption('days', null, sfCommandOption::PARAMETER_REQUIRED, '', 90),
    ));

    $this->namespace = 'jobeet';
    $this->name = 'cleanup';
    $this->briefDescription = 'Cleanup Jobeet database';

    $this->detailedDescription = <<<EOF
The [jobeet:cleanup|INFO] task cleans up the Jobeet database:

  [./symfony jobeet:cleanup --env=prod --days=90|INFO]
EOF;
  }

  protected function execute($arguments = array(), $options = array())
  {
    $databaseManager = new sfDatabaseManager($this->configuration);

    $nb = JobeetJobPeer::cleanup($options['days']);

    $this->logSection('propel', sprintf('Removed %d stale jobs', $nb));
  }
}

La configuración de la tarea se realiza en el método configure(). Cada tarea debe tener un nombre único (namespace:nombre) y puede tener argumentos y opciones.

Nota Puedes echar un vistazo a las tareas que incluye Symfony (en el directorio lib/task/) para ver más ejemplos de uso.

La tarea jobeet:cleanup define dos opciones, --env y --days, que a su vez definen valores por defecto adecuados.

Las tareas propias se ejecutan exactamente igual que cualquier otra tarea de Symfony:

$ php symfony jobeet:cleanup --days=10 --env=dev

Como siempre, el código que se encarga de limpiar la base de datos se ha incluido en la clase JobeetJobPeer:

// lib/model/JobeetJobPeer.php
static public function cleanup($days)
{
  $criteria = new Criteria();
  $criteria->add(self::IS_ACTIVATED, false);
  $criteria->add(self::CREATED_AT, time() - 86400 * $days, Criteria::LESS_THAN);

  return self::doDelete($criteria);
}

El método doDelete() elimina de la base de datos todos los registros que cumplen con los criterios de búsqueda del objeto Criteria. A este método también se le puede pasar un array de claves primarias.

Nota Las tareas de Symfony devuelven un valor en función del éxito en la ejecución de la tarea. Si quieres devolver un valor específico, puedes hacerlo añadiendo al final de la tarea una instrucción return que devuelva un número entero.