簡體   English   中英

將參數傳遞給控制器​​Symfony2的命令

[英]Pass parameter to command from controller 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中獲取實體作為參數?
  • 如何從控制器調用此命令並將所需的實體作為參數傳遞?

謝謝。

您不能將實體直接傳遞到控制台命令。 而不是您應該將實體的“ id”作為參數傳遞,然后使用存儲庫並通過其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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM