Descubre cómo puedes generar fácilmente la clase de repositorio de una entidad existente con un solo comando en Symfony 5.

Symfony 5 usa el ORM de Doctrine, lo que hace que las cosas sean realmente fáciles para comenzar con tu nuevo proyecto basado en Symfony. Personalmente, me encanta actualizar proyectos antiguos que usan bases de datos MySQL, ya que es bastante fácil hacer ingeniería inversa y construir las entidades a partir de un esquema de base de datos ya existente.

Doctrine repositories are meant to work as a way to retrieve entities so to speak, you can extend repositories with any method you need to get custom data, for example getUsersWithIntelProcessors or something like that. In this article, we will explain you how to easily generate a custom repository class for an entity in Symfony 5.

Los repositorios de Doctrine están destinados a funcionar como una forma de recuperar entidades, por así decirlo, puedes ampliar los repositorios con cualquier método que necesites para obtener datos personalizados, por ejemplo getUsuariosConProcesadorIntel o algo así. En este artículo, te explicaremos cómo generar fácilmente una clase de repositorio personalizada para una entidad en Symfony 5.

Ejemplo de repositorio de Doctrine en Symfony 5

If you are looking for a way to create quickly a repository for an entity, you can easily copy the following class replacing MyEntity with the name of your entity (even in the filename) and it should work as a custom repository class for your entity:

Si estás buscando una manera de crear rápidamente un repositorio para una entidad, puedes copiar fácilmente la siguiente clase reemplazándo MyEntity con el nombre de tu entidad (incluso en el nombre del archivo) y debería funcionar como una clase de repositorio personalizada para tu entidad:

<?php
// /src/Repository/MyEntityRepository.php
namespace App\Repository;

use App\Entity\MyEntity;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;

/**
 * @method MyEntity|null find($id, $lockMode = null, $lockVersion = null)
 * @method MyEntity|null findOneBy(array $criteria, array $orderBy = null)
 * @method MyEntity[]    findAll()
 * @method MyEntity[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class MyEntityRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, MyEntity::class);
    }

    // /**
    //  * @return MyEntity[] Returns an array of MyEntity objects
    //  */
    /*
    public function findByExampleField($value)
    {
        return $this->createQueryBuilder('c')
            ->andWhere('c.exampleField = :val')
            ->setParameter('val', $value)
            ->orderBy('c.id', 'ASC')
            ->setMaxResults(10)
            ->getQuery()
            ->getResult()
        ;
    }
    */

    /*
    public function findOneBySomeField($value): ?MyEntity
    {
        return $this->createQueryBuilder('c')
            ->andWhere('c.exampleField = :val')
            ->setParameter('val', $value)
            ->getQuery()
            ->getOneOrNullResult()
        ;
    }
    */
}

Generando clase de repositorio automáticamente

Si deseas hacer esto automáticamente con un comando, Symfony también te proporciona una manera fácil de hacerlo. Primero, asegúrate de especificar en la anotación de tu entidad, el nombre de la nueva clase de repositorio, por ejemplo:

/**
 * MyEntity
 *
 * @ORM\Table(name="my_entity")
 * @ORM\Entity(repositoryClass="App\Repository\MyEntityRepository")
 */

Como puedes ver, dentro del comentario y anotacion @ORM\Entity(), puedes especificar la propiedad repositoryClass con el espacio de nombres de la clase de repositorio que se creará. Por ejemplo, con toda la clase de entidad, debería verse así:

<?php

// /src/Entity/MyEntity.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * MyEntity
 *
 * @ORM\Table(name="my_entity")
 * @ORM\Entity(repositoryClass="App\Repository\MyEntityRepository")
 */
class MyEntity
{
    // .. 

    // Propiedades y metodos de tu entidad

    // ..
}

Una vez que lo verifiques, ejecuta el siguiente comando en tu proyecto Symfony:

php bin/console make:entity --regenerate App

Esto debería generar una salida similar a:

 created: src/Repository/MyEntityRepository.php
 no change: src/Entity/OtherEntitiesYouMayHave.php

  Success! 
           

Done.

Esto especificará qué archivos se crearon o modificaron, en el caso de la creación de una clase de entidad personalizada, deberías ver una sola línea creada.

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores