Laravel 5 & Command Bus : Préciser le nom du tube

Laravel 5 est livré avec quelques outils permettant de prendre rapidement en main le design pattern Command Bus.

C’est assez génial de voir que simplement en implémentant votre classe avec l’interface ShouldBeQueued, vous n’aurez rien d’autre à faire si vous avez déjà configuré Beanstalkd ou autre.

C’est très pratique, mais le job part automatiquement dans le tube par défaut.

Heureusement, même si il n’y a pas encore de précision dans la documentation, Laravel offre la possibilité de spécifier quel tube utiliser.

 Coup d’oeil sur Dispacher.php

	/**
	 * Dispatch a command to its appropriate handler behind a queue.
	 *
	 * @param  mixed  $command
	 * @return mixed
	 *
	 * @throws \RuntimeException
	 */
	public function dispatchToQueue($command)
	{
		$queue = call_user_func($this->queueResolver);
		if ( ! $queue instanceof Queue)
		{
			throw new \RuntimeException("Queue resolver did not return a Queue implementation.");
		}
		if (method_exists($command, 'queue'))
		{
			$command->queue($queue, $command);
		}
		else
		{
			$queue->push($command);
		}
	}

La partie intéressante c’est : if (method_exists($command, ‘queue’))

Ce qui veut dire que si dans la « Command » (entendez par là, la classe que vous tentez de dispatcher) il y a une méthode queue(), alors je l’exécute.

Exemple d’utilisation

Prenons pour exemple une commande FooCommand. Il suffit donc d’implémenter l’interface ShouldBeQueued, ajouter le trait InteractWithQueue si vous en avez besoin. Ensuite, ajouter la méthode queue() à votre classe FooCommand comme ceci :


public function queue($queue, $command)
{
    $queue->pushOn('nom_du_tube', $command);
}

metrogeek

Comments 1

Laisser un commentaire