2013-10-11 4 views
7

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

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

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

ответ

11

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

См. Главу «Документация по командам» - Getting Services from the Container.

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(); 
     // ... 
6

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

Просто используйте PSR-4 services autodiscovery в вашем services.yml:

services: 
    _defaults: 
     autowire: true 

    App\Command\: 
     resource: ../Command 

Затем используйте общий Constructor Injection и, наконец, даже 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 года), когда commands will be lazy loaded.

Смежные вопросы