Bazı işlemleri yapıp, sonucu bize geri vermesi için bir console komutu yaratıp, onu daha sonradan controller içinden çağırbiliriz. Aşağıdaki örnek verilen iki değeri çarpıp sonucu geri verir ve aynı zamanda gerekli kayıtları tutar.


Services.yml


services:
application_backend.command.calculator:
class: Application\BackendBundle\Command\CalculatorCommand
calls:
- [setContainer, [@service_container]]

CalculatorCommand


namespace Application\BackendBundle\Command;

use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class CalculatorCommand extends ContainerAwareCommand
{
/**
* @var $logger LoggerInterface
*/
private $logger;

protected function configure()
{
$this
->setName('get:total')
->addArgument(
'controller',
InputArgument::REQUIRED,
'What is controller name?'
)
->addArgument(
'primary',
InputArgument::REQUIRED,
'What is primary number?'
)
->addArgument(
'secondary',
InputArgument::OPTIONAL,
'What is secondary number?'
)
->setDescription('This multiplies given numbers.');
}

protected function initialize(InputInterface $input, OutputInterface $output)
{
$this->logger = $this->getContainer()->get('logger');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$this->logger->info(
sprintf(
'Calling CalculatorCommand from [%s] with [%s] [%s] argument(s) at %s.',
$input->getArgument('controller'),
$input->getArgument('primary'),
$input->getArgument('secondary'),
date('Y-m-d H:i:s')
)
);

return $input->getArgument('primary') * $input->getArgument('secondary');
}
}

ApiController


Varsayalım ki @application_backend.command.calculator servisini controller içine controllers.yml dosyası ile enjekte ettiniz.


namespace Application\BackendBundle\Controller;

use Application\BackendBundle\Command\CalculatorCommand;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\HttpFoundation\Response;

class ApiController extends AbstractController
{
......
......

public function indexAction()
{
$input = new ArrayInput(['controller'=> 'ApiController', 'primary'=> 5, 'secondary'=> 3]);
$output = new NullOutput();
$result = $this->calculatorCommand->run($input, $output);

return new Response($result);
}
}

Test


Eğer yukarıdaki contollerı çağırırsanız, sonuç olarak 15 geri verilir ve dev.log dosyası içine aşağıdaki satır girilir.


[2015-07-26 17:02:35] app.INFO: Calling CalculatorCommand from [ApiController] with [5] [3] argument(s) at 2015-07-26 17:02:35. [] []