Novedades en Laravel 5: Comandos

Laravel 5 adquiere de serie la característica de generar comandos y consumirlos mediante un handler.

Los comandos de Laravel 5 son una nueva característica similar a la librería Tactician que podíamos utilizar en Laravel 4.

Un comando es una tarea que registramos para que uno o varios handlers asociados la procesen, ya sea instantáneamente o enviándola a una cola de procesamiento (queue) para ejecutarse más tarde de manera asíncrona.

Generar comandos

Para generar un nuevo comando utilizaremos php artisan make:command CommandName, que generará el siguiente fichero en app/Commands:

namespace App\Commands;

use App\Commands\Command;
use Illuminate\Contracts\Bus\SelfHandling;

class CommandName extends Command implements SelfHandling
{

  /**
   * Create a new command instance.
   *
   * @return void
   */
  public function __construct()
  {
    //
  }

  /**
   * Execute the command.
   *
   * @return void
   */
  public function handle()
  {
    //
  }
}

Si queremos varios handlers o necesitamos que el handler se encuentre separado de nuestro comando, añadiremos el flag --handler al comando artisan y generará un nuevo fichero en app/Handlers/Commands. De lo contrario, se implementará la clase SelfHandling automáticamente para poder utilizar nuestro método handle() desde el propio comando.

También podemos generar únicamente un handler para el comando mediante php artisan handler:command CommandHandlerName.

Si queremos que nuestra tarea se ejecute de manera asíncrona y no bloqueante añadiremos el flag --queued al comando artisan, lo que hará que nuestro comando implemente la clase ShouldBeQueued.

El comando generado contiene dos métodos a no ser que hayamos utilizado --handler, en cuyo caso el método handle() estará en el fichero localizado en app/Handlers/Commands.

Constructor

El primer método es el constructor y sirve para pasar a nuestro método handle() los objetos que necesitemos. El constructor funciona de la siguiente manera:

protected $task, $user;

/**
 * Create a new command instance.
 *
 * @return void
 */
public function __construct(Task $task, User $user)
{
  $this->task = $task;
  $this->user = $user;
}

Si utilizamos --handler necesitaremos exportar públicamente nuestros objetos para así poder utilizarlos desde el handler.

Handler

El método handle() es donde escribiremos nuestra tarea. Podemos lanzar eventos tras finalizar nuestras acciones o lo que nos apetezca, no tiene gran misterio.

Ejecutar comandos

Para ejecutar un comando despacharemos una nueva instancia dentro de nuestros controladores mediante $this->dispatch(new CommandName($params));. Esto hará que Lavarel envíe la orden mediante el bus de comandos, que se encargará de gestionar el comando y los handlers correctamente.

Recuerda que hay más documentación sobre comandos y queues en el sitio oficial.

Compartir en

Facebook Twitter Google+ LinkedIn