2015-08-27 11 views
5

Próbuję utworzyć polecenie konsoli symfony, aby uruchomić punkt końcowy.Symfony 2 - Wywołanie metody kontrolera z polecenia konsoli

BillingBundle/Command/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"); 
    } 
} 
?> 

Próbuję zadzwonić i punkt końcowy zdefiniowano w

BillingBundle/Usługi/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 
} 

Działa to dobrze, gdy wywołuję punkt końcowy/rejectLines za pomocą POSTman. Jednak nie jestem pewien, w jaki sposób mogę zadzwonić z poleceniem konsoli tak, że gdy zgłoszę

php app/console cron: rejectLines

to działa.

Oto, co chcę osiągnąć.

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

Jednakże, ponieważ klasa SalesOrderService ma jakieś argumenty przekazane do __construct, nie jestem pewien, w jaki sposób mogę przekazać ją podczas rozmowy przez polecenia. Dowolny pomysł ?

+0

Czy próbowałeś uruchomić go w CLI? Co to jest wyjście? –

Odpowiedz

2

Nie trzeba przekazywać argumentów z wiersza polecenia. Potrzebujesz swojej usługi, aby jej parametry zostały wstrzyknięte dzięki pojemnikowi DI.

Widzę adnotację InjectParams na kontrolerze, więc uważam, że używasz JMSDiExtraBundle. W tym przypadku można wprowadzić parametry na usługi/sterownika (jak ty) i narażać go też jako usługa z

<?php 

use JMS\DiExtraBundle\Annotation\Service; 

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

Teraz można zastosować metodę polecenia ContainerAwareCommand i używać pojemnika, aby otrzymać (całkowicie wstrzyknięty) usługi z

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

Twój SalesOrderService jest usługą, która cyklu życia jest zarządzany przez kontener Symfony2 przez system wtrysku zależność. Więc prawdopodobnie znaleźć nazwę, która usługa jest zadeklarowane w definicji klasy (używasz di-extra-bundle) tak:

  1. Sprawdź nazwę definicji usługi w imieniu klasy adnotacji. Jako przykład coś takiego:

    /** 
    * @Service("salesorder.service.id") 
    */ 
    class SalesOrderService 
    
  2. prośba do pojemnika w konsoli komendę:

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

nadzieję, że to pomaga