PauloRB.dev

Desenvolvedor de Software

Como acessar o entity Manager(Doctrine) dentro de comandos no Symfony 5 | PauloRB.dev Como acessar o entity Manager(Doctrine) dentro de comandos no Symfony 5 – PauloRB.dev
Como acessar o entity Manager(Doctrine) dentro de comandos no Symfony 5

Como acessar o entity Manager(Doctrine) dentro de comandos no Symfony 5

Ao termos de criar comandos personalizados no Symfony na maioria das vezes se faz necessário o uso de alguma interação no banco de dados quer seja a criação, edição ou até mesmo a exclusão de um registro.

No exemplo abaixo vamos ver como podemos acessar o EntityManager do Doctrine e assim pode realizar as mais diversas operações que o ORM nos oferece.

Utilizar os recursos do Doctrine em Commands, é bem fácil também, mas não está claro na documentação oficial como faze-lo. Assim como tudo no Symfony 5, você pode injetar serviços através do construtor de Services and Commands, então para obter o EntityManager dentro de um comando, você só precisaria injetar o EntityManagerInterface assim:

<?php

namespace App\Command;

// ...

use Doctrine\ORM\EntityManagerInterface;

class ExampleCommand extends Command
{
    // ...

    private $entityManager;

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

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

O gerenciador de entidades(EntityManager) estará acessível a toda a classe e você poderá executar consultas, criar e persistir entidades como costuma fazer em controladores e serviços.
Vamos ver alguns exemplos:
Detalhes de como criar um comando no Symfony foram omitidos por entedermos que essa parte você já tem ententimento e de que o código abaixo é bem autoexplicativo.

<?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
{
    // o nome do comando (a parte depois de "bin/console")
    protected static $defaultName = 'app:run-example';
    
    // 2. Exponha o EntityManager no nível de classe
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        // 3. Atualize o valor da variável privada entityManager por meio de injeção
        $this->entityManager = $entityManager;

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

    // 4. Use o entityManager no código do comando
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->entityManager;
        
        // A. Access repositories
        $repo = $em->getRepository("App:SomeEntity");
        
        // B. Search using regular methods.
        $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. Persist and flush
        $em->persist($someEntity);
        $em->flush();
         
        return 0;
    }
}

Referência: https://ourcodeworld.com/articles/read/1131/how-to-access-the-entity-manager-doctrine-inside-a-command-in-symfony-5#

Mais Posts

Importando Dados de um Arquivo CSV para o PostgreSQL Usando PDO::pgsqlCopyFromArray no Laravel

Importando Dados de um Arquivo CSV para o PostgreSQL Usando PDO::pgsqlCopyFromArray no Laravel

O método PDO::pgsqlCopyFromArray permite copiar dados de um array diretamente para uma tabela no PostgreSQL. Este tutorial mostra como usar... Leia mais

Como rodar Laravel no WSL com Valet Linux (de verdade)

Como rodar Laravel no WSL com Valet Linux (de verdade)

Sim, dá pra desenvolver Laravel no Windows sem sofrer. Mas você precisa fazer do jeito certo: usando WSL + Valet... Leia mais

Como Usar a Porta 443 para Conexões SSH com o Bitbucket e Contornar Restrições de Rede

Como Usar a Porta 443 para Conexões SSH com o Bitbucket e Contornar Restrições de Rede

Se você já se deparou com a frustrante mensagem de erro “ssh: connect to host bitbucket.org port 22: Network is... Leia mais

Formas de Paginação de Dados no Laravel

Formas de Paginação de Dados no Laravel

No desenvolvimento de aplicações web, a paginação de dados é um recurso fundamental quando se trabalha com grandes volumes de... Leia mais