2013-10-11 11 views
7

Ich bin neu in Symfony. Ich habe einen benutzerdefinierten Befehl erstellt, dessen einziger Zweck es ist, Demo-Daten vom System zu löschen, aber ich weiß nicht, wie ich das machen soll.Symfony2 - Zugriff auf den Dienst in einem benutzerdefinierten Konsolenbefehl?

Im Controller ich tun würde:

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

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

dieses Tun von der execute() Funktion in dem Befehl, den ich bekommen:

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

Wie würde ich dies tun, aus der execute() Funktion ? Auch wenn es eine einfachere Möglichkeit gibt, die Daten zu löschen, als sie zu durchlaufen und zu entfernen, können Sie sie gerne erwähnen.

Antwort

11

Um auf den Servicebehälter zugreifen zu können, muss Ihr Befehl Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand erweitern.

Siehe Kapitel Dokumentation - 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

Seit Symfony 3.3 (Mai 2017) können Sie Dependency Injection in Befehle mit Leichtigkeit verwenden.

PSR-4 services autodiscovery Verwenden Sie einfach in Ihrem services.yml:

services: 
    _defaults: 
     autowire: true 

    App\Command\: 
     resource: ../Command 

Dann gemeinsame Constructor Injection verwenden und schließlich sogar Commands werden saubere Architektur haben:

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

Dies wird (oder bereits getan hat, hängt von Zeitablesung) werden zu Standards seit Symfony 3.4 (November 2017), wenn commands will be lazy loaded.

Verwandte Themen