2015-05-10 108 views
0

我有一個執行某些操作的命令,這些操作取決於傳入參數的實體。將參數傳遞給來自控制器的命令Symfony2

checkAlertCommand.php:

<?php 

namespace MDB\PlatformBundle\Command; 

use Symfony\Component\Console\Command\Command; 
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 checkAlertCommand extends Command { 

    protected function configure() { 
     $this 
       ->setName('platform:checkAlert') 
       ->setDescription('Check the alert in in function of the current advert') 
       ->addArgument(
         'postedAdvert' 
     ); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) { 
     $postedAdvert = $input->getArgument('postedAdvert'); 
     $output->writeln($postedAdvert->getTitre()); 
    } 

} 

?> 

所以我的問題是:

  • 如何獲得一個實體作爲參數在checkAlertCommand.php
  • 如何從控制器調用此命令並將所需實體作爲參數傳遞?

謝謝。

回答

0

您無法直接將實體傳遞給控制檯命令。而不是你應該通過實體的「身份證」作爲參數,然後使用存儲庫,並通過它的ID拿起所需的實體。

<?php 

namespace MDB\PlatformBundle\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 checkAlertCommand extends ContainerAwareCommand { 

    protected function configure() { 
     $this 
       ->setName('platform:checkAlert') 
       ->setDescription('Check the alert in in function of the current advert') 
       ->addArgument(
         'postedAdvertId' 
     ); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) { 
     $postedAdvertId = $input->getArgument('postedAdvertId'); 

     $em = $this->getContainer()->get('doctrine')->getManager(); 
     $repo = $em->getRepository('MDBPlatformBundle:PostedAdvert'); 
     $postedAdvert = $repo->find($postedAdvertId); 
     $output->writeln($postedAdvert->getTitre()); 
    } 

} 

?> 

應使用Process組件來運行的控制器內的命令。

use Symfony\Component\Console\Input\ArrayInput; 
use Symfony\Component\Console\Output\NullOutput; 
use MDB\PlatformBundle\Command\checkAlertCommand; 

    class MyController extends Controller 
    { 
     public function indexAction() 
     { 
      // get post $postedAdvertId here 
      .... 
      $command = new checkAlertCommand(); 
      $command->setContainer($this->container); 
      $input = new ArrayInput(array('postedAdvertId' => $postedAdvertId)); 
      $output = new NullOutput(); 
      $result = $command->run($input, $output); 
      ... 
     } 
    } 

更新:回答你的問題

我不知道你到底是什麼意思「異步」,但鑑於例如執行同步方式的命令,因此意味着控制器將等到命令將完成,然後纔會轉到下一個操作。但是,如果您需要以異步方式(以後臺方式)運行它,則應該使用進程組件http://symfony.com/doc/current/components/process.html

+0

正是我在找的東西。並感謝有關事實的信息,它是不可能通過一個實體:) – LedZelkin

+0

只是一個更多的問題,當我從我的控制器調用命令時,它是異步嗎?該命令是否與其餘代碼執行的時間相同? – LedZelkin

+0

已更新我的回答 –

相關問題