Symfony 4: doctrine in command

痞子三分冷 提交于 2019-12-19 09:06:08

问题


I am using symfony 4 and I want to access a repository for an entity if I am in the Command class. There is not a function getDoctrine or something..

I have created an Entity through the console, so I got an entity and a repository.

Does anybody know how I can access the repository?


回答1:


The best practice is to delegate this task to a service. See this example: https://symfony.com/doc/current/console.html#getting-services-from-the-service-container

However you can also add a constructor to the command and give it a ContainerInterface. Then you just do $this->container->get('doctrine')->getManager();

// YourCommand.php

private $container;

public function __construct(ContainerInterface $container)
{
    parent::__construct();
    $this->container = $container;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
    $em = $this->container->get('doctrine')->getManager();

    // do stuff...
}

Also, don't forget to add the proper "use" statement at the beggining of your script:

use Symfony\Component\DependencyInjection\ContainerInterface;



回答2:


The official Symfony 4 advice is to autowire only what you need. So instead of injecting ContainerInterface and requesting an EntityManager from that, inject EntityManagerInterface directly:

use Doctrine\ORM\EntityManagerInterface;

class YourCommand extends Command
{

    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        parent::__construct();
        $this->em = $em;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->em->persist($thing);
        $this->em->flush();
    }

}



回答3:


Using Symfony 4.2 here.

use Symfony\Component\Console\Command\Command;
use Doctrine\DBAL\Connection;

class ArchiveCommand extends Command
{
   protected static $defaultName = 'simon:test:archive';
   private $connection;

   public function __construct(Connection $connection)
   {
      $this->connection = $connection;
      parent::__construct();
   }

   /**
   * {@inheritdoc}
   */
   protected function execute(InputInterface $input, OutputInterface $output)
   {
      $this->connection->prepare('SQL HERE');
   }

Works exactly as getting it from the container but is deprecated using it from the containerAwareInterface and should be injected now.




回答4:


$kernel = $this->getApplication()->getKernel();
$container = $kernel->getContainer();

// Get doctrine
$em = $container->get('doctrine')->getManager();



回答5:


I use this syntax :

    $em = $this->getContainer()->get('doctrine')->getEntityManager();


来源:https://stackoverflow.com/questions/48234418/symfony-4-doctrine-in-command

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!