How to use my Entities and Entity Managers in Symfony 2 Console Command?

后端 未结 3 1387
面向向阳花
面向向阳花 2020-12-29 01:34

I want to a few terminal commands to my Symfony2 application. I\'ve gone through the example in the cookbook, but I couldn\'t find out how to access my settings, my entity m

相关标签:
3条回答
  • 2020-12-29 02:21

    I know that Matt's answer solved the question, But if you've more than one entity manager, you can use this:

    Make model.xml with:

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services         http://symfony.com/schema/dic/services/services-1.0.xsd">
    
    <services>
        <service id="EM_NAME.entity_manager" alias="doctrine.orm.entity_manager" />
    </services>
    </container>
    

    Then load this file in your DI extension

    $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('model.xml');
    

    Then you can use it anywhere. In Console Command execute:

    $em = $this->getContainer()->get('EM_NAME.entity_manager');
    

    and don't forget at end to :

    $em->flush();
    

    You can now use it as a argument in another service in services.yml:

    services:
        SOME_SERVICE:
            class: %parameter.class%
            arguments:
                - @EM_NAME.entity_manager
    

    Hope this help someone.

    0 讨论(0)
  • 2020-12-29 02:26

    I think you should not retrieve the container in the constructor directly. Instead, retrieve it in the configure method or in the execute method. In my case, I get my entity manager just at the start of the execute method like this and everything is working fine (tested with Symfony 2.1).

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $entityManager = $this->getContainer()->get('doctrine')->getEntityManager();
    
        // Code here
    }
    

    I think that the instantiation of the application object is not done yet when you are calling getContainer in your constructor which result in this error. The error comes from the getContainer method tyring to do:

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

    Since getApplication is not an object yet, you get the a error saying or are calling a method getKernel on a non-object.

    Update: In newer version of Symfony, getEntityManager has been deprecated (and could have been removed altogether by now). Use $entityManager = $this->getContainer()->get('doctrine')->getManager(); instead. Thanks to Chausser for pointing it.

    Update 2: In Symfony 4, auto-wiring can be used to reduce amount of code needed.

    Create a __constructor with a EntityManagerInterface variable. This variable will be accessible in the rest of your commands. This follows the auto-wiring Dependency Injection scheme.

    class UserCommand extends ContainerAwareCommand { 
      private $em; 
    
      public function __construct(?string $name = null, EntityManagerInterface $em) { 
        parent::__construct($name); 
    
        $this->em = $em;
      } 
    
      protected function configure() { 
        **name, desc, help code here** 
      }
    
      protected function execute(InputInterface $input, OutputInterface $output) { 
        $this->em->getRepository('App:Table')->findAll();
      }
    }
    

    Credits to @profm2 for providing the comment and the code sample.

    0 讨论(0)
  • 2020-12-29 02:30

    extends your command class from ContainerAwareCommand instead of Command

    class YourCmdCommand extends ContainerAwareCommand
    

    and get entity manager like this :

    $em = $this->getContainer()->get('doctrine.orm.entity_manager');
    
    0 讨论(0)
提交回复
热议问题