2013-10-11 7 views
7

Sono nuovo di Symfony. Ho creato un comando personalizzato il cui unico scopo è cancellare i dati demo dal sistema, ma non so come farlo.Symfony2 - Come accedere al servizio in un comando di console personalizzato?

Nel controllore vorrei fare:

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

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

In questo modo dalla funzione execute() nel comando ottengo:

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

Come farei questo dalla funzione execute() ? Inoltre, se esiste un modo più semplice per cancellare i dati oltre a farli scorrere e rimuoverli, sentiti libero di menzionarli.

risposta

11

Per poter accedere al contenitore di servizi il comando deve estendere Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand.

Vedere il capitolo Documentazione comandi - 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

Dal Symfony 3.3 (Maggio 2017) è possibile utilizzare Dependency Injection nei comandi con facilità.

Basta usare PSR-4 services autodiscovery nella vostra services.yml:

services: 
    _defaults: 
     autowire: true 

    App\Command\: 
     resource: ../Command 

Quindi utilizzare comune Constructor iniezione e, infine, anche Commands avrà un'architettura pulita:

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

Questo sarà (o già fatto, dipende di lettura del tempo) diventano standard dal Symfony 3.4 (novembre 2017), quando commands will be lazy loaded.