Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github

Como criar um Comando de Console

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.

Registrando os Comandos Automaticamente

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

Testando Comandos

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());

        // ...
    }
}

Obtendo Serviços do Container de Serviços

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!'));
    }
}