El tutorial Jobeet

6.6. Refactorizando

Una vez más, aunque el código anterior funciona bien, no es correcto del todo. ¿Sabes por qué?

El código que contiene el objeto Criteria no debe incluirse en la acción (es decir, en la capa del controlador), ya que pertenece a la capa del modelo. En la arquitectura MVC, el modelo define toda la lógica de negocio y el controlador simplemente realiza llamadas al modelo para obtener los datos. Como se trata de un código que devuelve un listado de ofertas de trabajo, vamos a crear un método llamado getActiveJobs() en la clase JobeetJobPeer:

// lib/model/JobeetJobPeer.php
class JobeetJobPeer extends BaseJobeetJobPeer
{
  static public function getActiveJobs()
  {
    $criteria = new Criteria();
    $criteria->add(self::EXPIRES_AT, time(), Criteria::GREATER_THAN);

    return self::doSelect($criteria);
  }
}

Ahora el código de la acción puede utilizar este nuevo método para obtener todas las ofertas de trabajo activas.

public function executeIndex(sfWebRequest $request)
{
  $this->jobeet_job_list = JobeetJobPeer::getActiveJobs();
}

A continuación se indican las ventajas de esta refactorización respecto del código anterior:

  • La lógica que se encarga de obtener las ofertas de trabajo se encuentra en el modelo, el sitio al que pertenece.
  • El código del controlador ahora es mucho más fácil de leer.
  • El método getActiveJobs() se puede reutilizar siempre que se necesite, por ejemplo en otra acción.
  • Ahora se pueden realizar pruebas unitarias para el código del modelo.

Otra pequeña mejora consiste en ordenar las ofertas de trabajo según el valor de la columna expires_at:

static public function getActiveJobs()
{
  $criteria = new Criteria();
  $criteria->add(self::EXPIRES_AT, time(), Criteria::GREATER_THAN);
  $criteria->addDescendingOrderByColumn(self::EXPIRES_AT);

  return self::doSelect($criteria);
}

El método addDescendingOrderByColumn() añade una condición de tipo ORDER BY descendente a la sentencia SQL generada. Si quieres ordenar los registros de forma ascendente, también existe un método llamado addAscendingOrderByColumn().