Welcome to the Cookbook

loading...

3.13.1 Criando Shells & Tarefas

3.13.1.1 Criando seus próprios shells

Vamos criar um shell para uso no Console. Neste exemplo, criaremos um ‘report shell que exiba alguns dados do model. Primeiro, crie o arquivo report.php em /vendors/shells/.

<?php 
class ReportShell extends Shell {
	function main() {}
}
?>
  1. <?php
  2. class ReportShell extends Shell {
  3. function main() {}
  4. }
  5. ?>

A partir deste ponto, nós já podemos executar o shell, mas ele não faz muita coisa. Vamos adicionar alguns models ao shell para que possamos criar algum tipo de relatório. Isto pode ser feito da mesma maneira como fazemos no controller: incluindo os nomes dos models na variável $uses.

<?php
class ReportShell extends Shell {
	var $uses = array('Order');

	function main() {
	}
}
?>
  1. <?php
  2. class ReportShell extends Shell {
  3. var $uses = array('Order');
  4. function main() {
  5. }
  6. }
  7. ?>

Uma vez que tenhamos adicionado nosso model ao array $uses, podemos usá-lo no método main(). Neste exemplo, nosso model Order agora deve estar acessível no método main() como $this->Order de nosso novo shell.

Segue um exemplo simples da lógica que podemos usar neste shell:

class ReportShell extends Shell {
	var $uses = array('Order');
	function main() {
		// recupera os pedidos enviados no último mês
		$month_ago = date('Y-m-d H:i:s', strtotime('-1 month'));
		$orders =    $this->Order->find("all",array('conditions'=>"Order.shipped >= '$month_ago'"));

		// exibe as informações de cada pedido
		foreach($orders as $order) {
			$this->out('Data do pedido:	' .    $order['Order']['created'] . "\n");
			$this->out('Valor: $' .    number_format($order['Order']['amount'], 2) . "\n");
			$this->out('----------------------------------------' .    "\n");
	 
			$total += $order['Order']['amount'];
		}

		// exibe o valor total para os pedidos selecionados
		$this->out("Total: $" .    number_format($total, 2) . "\n"); 
	}
}
  1. class ReportShell extends Shell {
  2. var $uses = array('Order');
  3. function main() {
  4. // recupera os pedidos enviados no último mês
  5. $month_ago = date('Y-m-d H:i:s', strtotime('-1 month'));
  6. $orders = $this->Order->find("all",array('conditions'=>"Order.shipped >= '$month_ago'"));
  7. // exibe as informações de cada pedido
  8. foreach($orders as $order) {
  9. $this->out('Data do pedido: ' . $order['Order']['created'] . "\n");
  10. $this->out('Valor: $' . number_format($order['Order']['amount'], 2) . "\n");
  11. $this->out('----------------------------------------' . "\n");
  12. $total += $order['Order']['amount'];
  13. }
  14. // exibe o valor total para os pedidos selecionados
  15. $this->out("Total: $" . number_format($total, 2) . "\n");
  16. }
  17. }

Você deve poder rodar este shell executando este comando (se o comando cake estiver disponível no seu PATH):

$ cake report 

onde report é o nome do arquivo de shell em /vendor/shells/ sem a extensão .php. Isto deve retornar algo como:

Hello user,
   Welcome to    CakePHP v1.2 Console
   ---------------------------------------------------------------
   App : app
   Path:    /path/to/cake/app
   ---------------------------------------------------------------
   Data do pedido:    2007-07-30 10:31:12
   Valor:    $42.78
   ----------------------------------------
   Data do pedido:    2007-07-30 21:16:03
   Valor:    $83.63
   ----------------------------------------
   Data do pedido:    2007-07-29 15:52:42
   Valor:    $423.26
   ----------------------------------------
   Data do pedido:    2007-07-29 01:42:22
   Valor:    $134.52
   ----------------------------------------
   Data do pedido:    2007-07-29 01:40:52
   Valor:    $183.56
   ----------------------------------------
   Total:    $867.75

3.13.1.2 Tasks

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

Tasks (tarefas) são pequenas extensões para os shells. Elas permitem compartilhar lógica entre os shells, e são adicionadas por meio da variável de classe especial $tasks. Por exemplo, no shell bake ordinário possui diversas tarefas definidas:

<?php 
class BakeShell extends Shell {
   var $tasks = array('Project', 'DbConfig', 'Model', 'View', 'Controller');
}
?>
  1. <?php
  2. class BakeShell extends Shell {
  3. var $tasks = array('Project', 'DbConfig', 'Model', 'View', 'Controller');
  4. }
  5. ?>

Tarefas residem na pasta /vendors/shells/tasks/, em classes com o mesmo nome do arquivo, mais o prefixo Task. Assim, se quisermos criar uma nova tarefa ‘cool’, a classe CoolTask (que extende Shell) deve ser salva no arquivo /vendors/shells/tasks/cool.php. Já a classe VeryCoolTask (que extende Shell) deve estar no arquivo /vendors/shells/tasks/very_cool.php.

Cada tarefa deve implementar pelo menos um método execute() - os shells irão chamar este método para disparar a lógica da tarefa.

<?php
class SoundTask extends Shell {
   var $uses = array('Model'); // o mesmo que a variável $uses do controller
   function execute() {}
}
?>
  1. <?php
  2. class SoundTask extends Shell {
  3. var $uses = array('Model'); // o mesmo que a variável $uses do controller
  4. function execute() {}
  5. }
  6. ?>

Você pode acessar tarefas dentro de suas classes de shell e executá-las:

<?php 
class SeaShell extends Shell { // no arquivo /vendors/shells/sea.php
   var $tasks = array('Sound'); // no arquivo /vendors/shells/tasks/sound.php
   function main() {
       $this->Sound->execute();
   }
}
?>
  1. <?php
  2. class SeaShell extends Shell { // no arquivo /vendors/shells/sea.php
  3. var $tasks = array('Sound'); // no arquivo /vendors/shells/tasks/sound.php
  4. function main() {
  5. $this->Sound->execute();
  6. }
  7. }
  8. ?>

Se houver um método chamado “sound” na classe SeaShell, isto irá sobrescrever a capacidade do shell acessar a funcionalidade na tarefa Sound especificada no array $tasks.

Você também pode acessar tarefas diretamente a partir da linha de comando. Por exemplo, neste caso:

$ cake sea sound