0
respostas

Usar EntityManager em classes que não estendem controllers

No projeto que estou trabalhando usamos Zed2 com Doctrine.

Normalmente, para trabalhar com os dados usamos destas algumas formas. Exemplos:

$usuario = $this->entityManager->find(Usuario::class, $usuarioId);

$meuService = new MeuService($this->getServiceLocator());

$connection = $this->entityManager->getConnection();
$result = $connection->executeQuery($sql, ['idUsuario' => $usuarioId])->fetch();

O que todos tem em comum, é que estendem classes:

AbstractApplicationController
AbstractActionController
AbstractController

Que é de onde vem o ServiceLocator e EntityManager.

Geralmetne nas classes de serviços temos:

class QualquerService
{
    protected $sm;
    protected $em;

    function __construct(ServiceLocatorInterface $sm)
    {
        $this->setServiceManager($sm);
    }

    protected function setServiceManager($sm)
    {
        $this->sm = $sm;
    }

    protected function getServiceManager()
    {
        return $this->sm;
    }

    public function getEntityManager()
    {
        if (null === $this->em) {
            $this->em = $this->getServiceManager()->get('Doctrine\ORM\EntityManager');
        }
        return $this->em;
    }

    ....
}

A questão é que queria saber como usar o EntityManager e ServiceLocator sem depender dos controllers.

Temos serviços rodando em background nos quais precisaria do EntityManager/ServiceLocator mas não consigo passá-los como argumento.

Como eu poderia usá-los em uma nova classe que não herda nada?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software