2013-10-11 8 views
7

Jestem nowy w Symfony. Stworzyłem niestandardowe polecenie, którego jedynym celem jest usunięcie danych demo z systemu, ale nie wiem jak to zrobić.Symfony2 - Jak uzyskać dostęp do usługi za pomocą niestandardowego polecenia konsoli?

W regulatorze zrobiłbym:

$nodes = $this->getDoctrine() 
    ->getRepository('MyFreelancerPortfolioBundle:TreeNode') 
    ->findAll(); 

$em = $this->getDoctrine()->getManager(); 
foreach($nodes as $node) 
{ 
    $em->remove($node); 
} 
$em->flush(); 

Robi to z funkcji execute() w poleceniu uzyskać:

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

jaki sposób mogę to zrobić z funkcji execute() ? Ponadto, jeśli istnieje łatwiejszy sposób na wyczyszczenie danych, niż ich przeglądanie i usuwanie, możesz o tym wspomnieć.

Odpowiedz

11

Aby uzyskać dostęp do kontenera usług, konieczne jest rozszerzenie polecenia o Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand.

Zobacz rozdział Dokumentacja poleceń - 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

Od Symfony 3.3 (maj 2017) można użyć Dependency Injection w poleceniach z łatwością.

Wystarczy użyć PSR-4 services autodiscovery w services.yml:

services: 
    _defaults: 
     autowire: true 

    App\Command\: 
     resource: ../Command 

Następnie za pomocą wspólnego Konstruktor iniekcji i wreszcie nawet Commands będzie miał czystą architekturę:

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(); 
    } 
} 

To będzie (lub już nie, zależy od czas czytania) stają się standardami od Symfony 3.4 (listopad 2017), kiedy commands will be lazy loaded.

Powiązane problemy