Skip to content
Caution: You are browsing the legacy symfony 1.x part of this website.

Como criar uma tarefa

Language

Assim como qualquer aplicação, seu projeto possui tarefas de manutenção repetitivas, operações do banco de dados ou outros console scripts rodando em uma base regular.

O symfony 1.1 estende as tarefas pake do symfony 1.0 para criar um utilitário de linha de comando poderoso e uniforme para seus projetos, totalmente integrado com a Interfade de Linha de Comando (CLI) do symfony.

  • Acessibilidade: Qualquer tarefa pode ser executada com o parâmetro de ajuda, para obter a sintaxe, a descrição, opções disponíveis e mais. Qualquer pessoa será capaz de executar as suas tarefas.
  • Usabilidade: Executando a CLI do Symfony você obterá uma lista de tarefas, e até mesmo uma pessoa não desenvolvedora será capaz de aprender facilmente como executar uma.
  • Uniformidade: Descrevendo explicitamente as opções e parâmetros, a CLI do Symfony irá analisá-los, assim, você pode esquecer da problemática repetitiva tarefa de analisar $argv. Ele irá automaticamente alertar o usuário sobre a sintaxe incorreta ou parâmetros não informados.
  • Ambiente: O contexto é totalmente controlado, graças as novas classes ProjectConfiguration e ApplicationConfiguration. Você não precisa mais preocupar-se sobre ambientes hard-coded ou configurações de debug.
  • Legibilidade: Quem abrir o código-fonte irá obter grande descrição da entrada esperada e os objetivos da tarefa. O tempo de manutenção levado para entender e depurar o código será muito reduzido.

Vamos escrever a nossa primeira tarefa

Abra o diretório do seu projeto symfony 1.1 e digite:

$ php symfony generate:task doNothing

Ele irá iniciar uma tarefa vazia em lib/task/doNothingTask.class.php. Vamos sintonizá-lo um pouco.

class doNothingTask extends sfBaseTask
{
  protected function configure()
  {
    $this->namespace        = 'project';
    $this->name             = 'do-nothing';
    $this->briefDescription = 'Does strictly nothing';
 
    $this->detailedDescription = <<<EOF
Esta tarefa é completamente inútil, e deve ser executada com a maior freqüência possível.
EOF;
  }
 
  protected function execute($arguments = array(), $options = array())
  {
    $this->logSection('do-nothing', 'I did nothing successfully!');
  }
}

Esta tarefa, com toda a certeza não é muito, mas demonstra os primeiros conceitos básicos:

  • O método configure() descreve a tarefa. Nome de invocação, escopo, sintaxe, ajuda, opções e argumentos.
  • O método execute() é o que efetivamente faz todo o trabalho, e será chamado quando a tarefa é executada.
  • O método logSection() pode ser usado para exibir mensagens no console de saída.

Você pode brincar um pouco com ele:

$ php symfony help project:do-nothing
$ php symfony project:do-nothing

Alguma interação com a linha de comando

Argumentos e opções são a forma de fornecer parâmetros para a tarefa.

$ php symfony project:hello-world --name="Romain"

Aqui nós estamos executando a tarefa project:hello-world com a opção name definida para Romain

$ php symfony project:hello-world Hi

Agora, nós executaremos a mesma tarefa com o primeiro argumento definido como Hi.

Opções e argumentos podem possuir valores default, serem opcionais ou obrigatórios e incorporar seu propósito para ser exibido na sintaxe da tarefa.

Vamos escrever nossa tarefa project:hello-world:

class doHelloWorldTask extends sfBaseTask
{
  protected function configure()
  {
    $this->addArgument('verb', sfCommandArgument::OPTIONAL, 'Customize the verb used to say hello', 'hello');
    $this->addOption('name', null, sfCommandOption::PARAMETER_OPTIONAL, 'Customize the person to say hello to', 'world');
 
    $this->namespace        = 'project';
    $this->name             = 'hello-world';
    $this->briefDescription = 'Spread the (hello) world';
 
    $this->detailedDescription = <<<EOF
Runs an evolved hello world display, with customisable name and word.
EOF;
  }
 
  protected function execute($arguments = array(), $options = array())
  {
    $this->logSection('do', ucfirst($arguments['verb']).' '.ucfirst($options['name']));
  }
}

Agora, verifique como o symfony ajudará o usuário perdido sobre como utilizar a nossa nova tarefa:

$ php symfony project:hello-world invalid arguments given
$ php symfony help project:hello-world

E brincando um pouco com a tarefa:

$ php symfony project:hello-world
$ php symfony project:hello-world --name="romain"
$ php symfony project:hello-world --name=romain hi
$ php symfony project:hello-world hi --name=romain

Outras características úteis

  • Você precisa da camada do banco de dados?

    protected function execute($arguments = array(), $options = array())
    {
      $databaseManager = new sfDatabaseManager($this->configuration);
     
      // ...
    }
  • Executar outra tarefa dentro de uma tarefa?

    $myOtherTask = new myOtherTask($this->dispatcher, $this->formatter);
    $myOtherTask->run($arguments = array('foo' => 'bar'), $options = array('far' => 'boo'));
  • **Necessita permitir ao usuário escolher o ambiente, enquanto fornece um ambiente default?

    Simplesmente adicione a opção env no método ::configure() e o symfony irá utilizar o seu valor como o ambiente.

    $this->addOption('env', null, sfCommandOption::PARAMETER_OPTIONAL, 'Changes the environment this task is run in', 'prod');

O que você achou? Não é esta uma cereja sobre o bolo, ou por exemplo, algum coro de Jazz no symfony?

This work is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.