Symfony2 – Как получить доступ к службе в пользовательской консоли?

Я новичок в Symfony. Я создал пользовательскую команду, единственной целью которой является очистка демо-данных от системы, но я не знаю, как это сделать.

В контроллере я бы сделал:

$nodes = $this->getDoctrine() ->getRepository('MyFreelancerPortfolioBundle:TreeNode') ->findAll(); $em = $this->getDoctrine()->getManager(); foreach($nodes as $node) { $em->remove($node); } $em->flush(); 

Выполняя это из функции execute () в команде, я получаю:

 Call to undefined method ..... ::getDoctrine(); 

Как мне сделать это из функции execute ()? Кроме того, если есть более простой способ стереть данные, кроме того, чтобы прокручивать их и удалять, не стесняйтесь упоминать об этом.

Solutions Collecting From Web of "Symfony2 – Как получить доступ к службе в пользовательской консоли?"

Чтобы иметь доступ к контейнеру службы, вашей команде необходимо расширить Symfony \ Bundle \ FrameworkBundle \ Command \ ContainerAwareCommand .

См. Главу «Документация команд» – « Получение сервисов из контейнера» .

 use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; // ... other use statements class MyCommand extends ContainerAwareCommand { protected function execute(InputInterface $input, OutputInterface $output) { $em = $this->getContainer()->get('doctrine')->getEntityManager(); // ... 

Начиная с Symfony 3.3 (май 2017), вы легко можете использовать Dependency Injection в командах.

Просто используйте автообнаружение служб PSR-4 в своих services.yml .yml :

 services: _defaults: autowire: true App\Command\: resource: ../Command 

Затем используйте общий инжектор конструктора и, наконец, даже Commands будут иметь чистую архитектуру:

 final class MyCommand extends Command { /** * @var SomeDependency */ private $someDependency; public function __construct(SomeDependency $someDependency) { $this->someDependency = $someDependency; // this is required due to parent constructor, which sets up name parent::__construct(); } } 

Это будет (или уже было, зависит от времени чтения) стать стандартом с Symfony 3.4 (ноябрь 2017), когда команды будут ленивы загружены .