Symfony paso a paso (6) – Repositorios

En este post hablaré de como organizo las consultas a la BD, en Symfony está bastante claro: usando Repositorios.

El concepto de repositorio en Symfony es muy simple. No es más que una clase que expone una serie de métodos que devuelven datos o colecciones de datos, abstrayendo la capa de persistencia de la aplicación.

Para comprender este post asegúrate de haber leido antes la «Presentación del Proyecto WordWar: La Palabra del Día«

Qué métodos tendrá el repositorio?

Pensando en la lógica del app, se me ocurren así de primeras algunos métodos que necesitaré tarde o temprano:

  • findPublished() : devolverá todas las palabras que ya hayan sido publicadas ( publishedAt != NULL )
  • findUnublished() : devolverá todas las palabras que todavía no hayan sido publicadas ( publishedAt == NULL )
  • findByPublishedAt($date) : devolverá la palabra publicada un día en concreto
  • findTodayWord() : devolverá la palabra publicada hoy
  • findYesterdayWord() : devolvera la palabra publicada el día de ayer

Pues esto es todo, ahora a picar código, no me voy a parar a explicar los pormenores de DQL (Doctrine Query Language), simplemente comentar que siempre es mejor intentar utilizarlo para mantener la compatibilidad y no caer en la tentación de escribir directamente SQL.

Mi implementación del repositorio

    
class WordRepository extends \Doctrine\ORM\EntityRepository
{
    public function findPublished()
    {
        $qb = $this->createQueryBuilder('w');
        $qb->where($qb->expr()->isNotNull('w.published_at'));
        
        return $qb->getQuery()
            ->getResult();
    }
            
    public function findUnpublished(){
        return $this->findBy(['publishedAt' => null]);
    }
            
    public function findByPublishedAt(\DateTime $date)
    {
        return $this->findOneBy(['publishedAt' => $date]);
    }
    
    public function findTodayWord()
    {
        return $this->findByPublishedAt(new \DateTime());
    }
    
    public function findYesterdayWord()
    {
        $date = new \DateTime();
        $date->add(\DateInterval::createFromDateString('yesterday'));
        return $this->findByPublishedAt($date);
    }
}

Las ventajas de organizar las consultas de esta forma creo que están bastante claras: limpieza y legibilidad en el código, centralizar y abstraer el acceso a la BD, etc.

Commiteamos:

git add .
git commit -m  "Ads published_at property to Word. Rename description property to definition"

He escrito las consultas y commiteado con fe ciega en que funcionarían pero todavía no las he ejecutado. Podría mostrar en el index.html por ejemplo un listado con el resultado de cada consulta, pero con esto estaría creando código «temporal» de un solo uso, perdería tiempo en maquetar minimamente el html para ver los resultados … vamos a testearlo como dios manda. En el siguiente post hablaré de como crear algunos test automatizados que escribiremos una sola vez y utilizaremos durante tooooda la vida del proyecto.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.