Я новичок в 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 ()? Кроме того, если есть более простой способ стереть данные, кроме того, чтобы прокручивать их и удалять, не стесняйтесь упоминать об этом.
Чтобы иметь доступ к контейнеру службы, вашей команде необходимо расширить 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), когда команды будут ленивы загружены .