Aprende a obtener acceso al administrador de entidades para interactuar con tu base de datos dentro de un comando en Symfony 5.

Una de las cosas más habituales que hacemos con los comandos en Symfony, es el simple hecho de modificar cosas en la base de datos de acuerdo con las condiciones específicas de nuestra aplicación. Acceder a la base de datos a través del administrador de entidades en el controlador y los servicios es bastante simple y fácil de hacer. En Comandos, también es bastante fácil, pero no está documentado ni explicado en la documentación oficial. Al igual que todo en Symfony 5, puede inyectar servicios a través del constructor de Servicios y Comandos, por lo que para obtener el EntityManager dentro de un comando, solo necesitaría inyectar lo siguiente EntityManagerInterface:

<?php

namespace App\Command;

// ...

use Doctrine\ORM\EntityManagerInterface;

class ExampleCommand extends Command
{
    // ...

    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;

        parent::__construct();
    }
    
    // ...
}

El administrador de entidades será accesible para toda la clase y podrá ejecutar consultas, crear y conservar entidades como lo hace habitualmente en controladores y servicios.

Ejemplo

El siguiente archivo ExampleCommand.php contiene la lógica explicada anteriormente. Simplemente puede actualizar el código del comando y cambiar el nombre:

<?php

// src/Command/ExampleCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

// 1. Import the ORM EntityManager Interface
use Doctrine\ORM\EntityManagerInterface;

class ExampleCommand extends Command
{
    // el nombre del comando (la parte después de "bin / console")
    protected static $defaultName = 'app:run-example';
    
    // 2. Exponer EntityManager en el nivel de la clase.
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        // 3. Actualice el valor de la variable privada entityManager mediante inyección.
        $this->entityManager = $entityManager;

        parent::__construct();
    }
    
    protected function configure()
    {
        // ...
    }

    // 4. Utilice el administrador de la entidad en el código de comando ...
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->entityManager;
        
        // A. Acceder a repositorios
        $repo = $em->getRepository("App:SomeEntity");
        
        // B. Busque usando métodos regulares.
        $res1 = $repo->find(1);
        $res2 = $repo->findBy(['field' => 'value']);
        $res3 = $repo->findAll();
        $res4 = $repo->createQueryBuilder('alias')
            ->where("alias.field = :fieldValue")
            ->setParameter("fieldValue", 123)
            ->setMaxResults(10)
            ->getQuery()
            ->getResult();
        
        // C. Persistir y enjuagar
        $em->persist($someEntity);
        $em->flush();
         
        return 0;
    }
}

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