Cómo crear métodos personalizados para repositorios de Doctrine en Symfony 2

Cómo crear métodos personalizados para repositorios de Doctrine en Symfony 2

La creación de consultas sencillas o complejas es una labor diaria de un desarrollador de backend, sin embargo usualmente hay consultas que necesitan ser usadas en más de un lugar y ocupan más de 4 líneas de códigos (además de no ser nada faciles de recordar).

Un desarrollador sano y cuerdo no querrá escribir esa consulta en todos los lugares en los que necesita esa consulta, esa es la razón principal por la que crearemos métodos personalizados, pues además de ahorrar lineas de código, hace nuestro código mucho más sostenible y es además una buena práctica.

1. Crea una carpeta para los métodos personalizados en el Bundle

Vamos a crear una carpeta que contendrá todos las clases con métodos personalizados para los repositorios. Es recomendable crearla en la carpeta raiz de tu bundle (junto con las carpetas controller, entity, form). Esta carpeta tendrá el nombre de Repository.

2. Crea una clase con los métodos personalizados

Ahora simplemente necesitarás crear una clase con los métodos personalizados para tu repositorio, esta debe tener la siguiente estructura:

<?php

namespace myapp\myBundle\Repository; // Declara el namespace con tu bundle y "Repository" al final

use Doctrine\ORM\EntityRepository; // Necesitas importar la clase EntityRepository

/**
 * RegisterRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class myPersonalizadoRepository extends EntityRepository // Give a name to your class
{
    // Un simple método que ejecutaremos en el controlador así: : $total = $em->getRepository('mybundle:Something')->countSomething();
    public function countSomething()
    {
        return  $this->getEntityManager()
                ->createQuery('SELECT COUNT(a) FROM myBundle:Something a')
                ->getSingleScalarResult();
    }
}

3. Activa el repositorio de acuerdo a tu estilo de mapeo

Cómo todos sabemos, hay más de una manera de crear entidades en Symfony 2 con doctrine. Dependiendo de tu método preferido para ello, necesitarás activar la clase que creaste anteriormente de las siguientes maneras:

  • A) Método por anotación

Vamos a agregar el siguiente código en nuestra archivo de entidad (para la cual creamos los métodos personalizados):

// La entidad debería estar en : src/myapp/myBundle/Entity/Algo.php
/**
 * @ORM\Entity(repositoryClass="myapp\myBundle\Repository\myPersonalizadoRepository")  //Aquí va el namespace de la clase de métodos personalizados con el nombre de la clase al final, verifica el namespace en el paso 2
 */
class Algo
{
    // ..
}

  • B) Usando archivo orm (sin anotación)

Localiza el archivo de mapeado ORM (usualmente en myBundle/resources/config/doctrine/myfile.orm.yml) y agrega el parametro repositoryClass:

Locate the orm mapped file (usually in myBundle/resources/config/doctrine/myfile.orm.yml)  and add the repositoryClass line

myapp\myBundle\Entity\Something: # Esto ya debería existir
    type: entity # Esto ya debería existir
    table: something # Esto ya debería existir
    repositoryClass: myapp\myBundle\Repository\myPersonalizadoRepository# Agrega el path de la clase del repositorio al archivo orm.yml

4. Reconstruye las entidades

Finalmente simplemente ejecuta el comando generate:entities de doctrine en tu bundle

php app/console doctrine:generate:entities myBundle

Si hiciste todo correctamente, ahora podrás ejecutar los métodos personalizados desde tu repositorio en cualquier controlados. Si estás usando una clase de métodos personalizados, aun podrás acceder a los métodos predeterminados como find() findAll() sin problemas.

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable