2015-08-27 15 views
5

Sto tentando di creare un comando console symfony per eseguire un endpoint.Symfony 2 - Chiamare un metodo controller dal comando console

BillingBundle/Comando/RejectCommand.php

<?php 
namespace BillingBundle\Command; 
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputArgument; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Output\OutputInterface; 


class RejectCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('cron:rejectLines') 
      ->setDescription('Executes the RejectLines cron'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $output->writeln("Starting the cron"); 

     // Call the method here 

     $output->writeln("Cron completed"); 
    } 
} 
?> 

sto provando a chiamare e endpoint definito

BillingBundle/Servizi/SalesOrderService.php

/** 
    * @InjectParams({ 
    *  "repository" = @Inject("billing.repository.sales_order"), 
    *  "sapInterface" = @Inject("external.sap_sales_order_interface"), 
    *  "articleService" = @Inject("stream_one.product.interface.solution_store_product_service"), 
    *  "logger" = @Inject("logger") 
    * }) 
    */ 
    public function __construct(SalesOrderRepositoryInterface $repository, SapSalesOrderInterface $sapInterface, ArticleService $articleService, Logger $logger) { 
     $this->repository = $repository; 
     $this->sapInterface = $sapInterface; 
     $this->articleService = $articleService; 
     $this->logger = $logger; 
    } 


/** 
    * CRON: Reject lines 
    * 
    * @Post("/rejectLines", name="reject_lines_post") 
    */ 
    public function rejectSalesOrderLines() { 

// do some stuff and quit silently 
} 

Funziona bene quando chiamo il punto finale/rejectLines usando POSTman. Tuttavia, io non sono molto sicuro di come faccio a chiamare dalla console di comando in modo tale che quando chiamo

php app/console cron: rejectLines

funziona.

Questo è quello che voglio ottenere.

$cron = new SalesOrderService(); 
$cron->rejectSalesOrderLines(); 

Tuttavia, perché la classe SalesOrderService ha alcuni argomenti passati al __construct, io non sono del tutto sicuro di come posso passarlo al momento della chiamata attraverso la linea di comando. Qualche idea ?

+0

Hai provato a farlo funzionare in CLI? Qual è l'output? –

risposta

2

Non è necessario passare argomenti dalla riga di comando. Hai bisogno del tuo servizio per ottenere i suoi parametri iniettati grazie al contenitore DI.

Vedo annotazione InjectParams sul controller, quindi penso che si stia utilizzando JMSDiExtraBundle. In questo caso è possibile iniettare parametri sul vostro servizio/regolatore (come hai fatto) ed esporlo troppo come un servizio con

<?php 

use JMS\DiExtraBundle\Annotation\Service; 

/** 
* @Service("some.service.id") 
*/ 
class SalesOrderService 
{ 
    .... 
} 

Ora è possibile utilizzare il metodo del Comando ContainerAwareCommand e utilizzare il contenitore per ottenere il vostro (completamente iniettato) servizio con

$yourService = $this->getContainer()->get('some.service.id'); 
1

vostro SalesOrderService è un servizio che ciclo di vita è gestito dal contenitore Symfony2 dal sistema di iniezione di dipendenza. Così si rischia di trovare il nome che il servizio viene dichiarato nella definizione della classe (si utilizza il di-extra-bundle) così:

  1. Controllare il nome della definizione di servizio nel nome della classe di annotazione. A titolo di esempio, qualcosa come:

    /** 
    * @Service("salesorder.service.id") 
    */ 
    class SalesOrderService 
    
  2. Richiesta al contenitore nel comando console:

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
        $output->writeln("Starting the cron"); 
    
        // Call the method here 
        $service = $this->getContainer()->get('salesorder.service.id'); 
        $service-> rejectSalesOrderLines() 
        $output->writeln("Cron completed"); 
    } 
    

Spero che questo aiuto

Problemi correlati