Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github
A página Console na seção Componentes (O Componente Console) aborda como criar um comando de Console. Este artigo do cookbook abrange as diferenças ao criar comandos do Console com o framework Symfony2.
Para disponibilizar os comandos de console automaticamente com o Symfony2, adicione um diretório Command dentro de seu bundle e crie um arquivo php com o sufixo Command.php para cada comando que você deseja fornecer. Por exemplo, se você deseja estender o AcmeDemoBundle (disponível na Edição Standard do Symfony) para cumprimentar-nos a partir da linha de comando, crie o GreetCommand.php e adicione o seguinte código:
// src/Acme/DemoBundle/Command/GreetCommand.php
namespace Acme\DemoBundle\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 GreetCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('demo:greet')
->setDescription('Greet someone')
->addArgument('name', InputArgument::OPTIONAL, 'Who do you want to greet?')
->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
if ($name) {
$text = 'Hello '.$name;
} else {
$text = 'Hello';
}
if ($input->getOption('yell')) {
$text = strtoupper($text);
}
$output->writeln($text);
}
}
Este comando estará disponível automaticamente para executar:
$ app/console demo:greet Fabien
Ao testar os comandos utilizados como parte do framework completo Symfony\Bundle\FrameworkBundle\Console\Application deve ser usado em vez de Symfony\Component\Console\Application:
use Symfony\Component\Console\Tester\CommandTester;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Acme\DemoBundle\Command\GreetCommand;
class ListCommandTest extends \PHPUnit_Framework_TestCase
{
public function testExecute()
{
// mock the Kernel or create one depending on your needs
$application = new Application($kernel);
$application->add(new GreetCommand());
$command = $application->find('demo:greet');
$commandTester = new CommandTester($command);
$commandTester->execute(array('command' => $command->getName()));
$this->assertRegExp('/.../', $commandTester->getDisplay());
// ...
}
}
Usando Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand como classe base para o comando (em vez do mais básico Symfony\Component\Console\Command\Command), você tem acesso ao container de serviço. Em outras palavras, você tem acesso a qualquer serviço configurado. Por exemplo, você pode facilmente estender a tarefa para a mesma ser traduzível:
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
$translator = $this->getContainer()->get('translator');
if ($name) {
$output->writeln($translator->trans('Hello %name%!', array('%name%' => $name)));
} else {
$output->writeln($translator->trans('Hello!'));
}
}