Update default Bus binding in Lumen 5.2

With Laravel’s Lumen 5.2, gone are the handy functions dispatchFrom() and dispatchFromArray() available in the default Bus.

After a bit of searching I found AltThree’s Bus package, which basically the old Dispatcher, just being maintained outside of the Laravel core components.

However, it’s not as straight forward as creating a BusServiceProvider and rebinding the Bus Contract to the new Service Provider. If you take a look at the source, the Bus bindings are registered in the base Lumen Application.

Following advice from Graham Campbell, I was able to extend the base Lumen Application and override the registerBusBindings() method, so that any time the Bus’ Dispatcher Interface is requested, we return the AltThree implementation instead:

app/Application.php

<?php

namespace App;

use AltThree\Bus\Dispatcher;
use Illuminate\Contracts\Bus\Dispatcher as DispatcherContract;
use Illuminate\Contracts\Bus\QueueingDispatcher as QueueingDispatcherContract;
use Illuminate\Contracts\Queue\Factory;
use Laravel\Lumen\Application as LumenApplication;

class Application extends LumenApplication
{
/**
* Register container bindings for the application.
*
* @return void
*/
protected function registerBusBindings()
{
$this->app->singleton(Dispatcher::class, function (Application $app) {
return new Dispatcher($app, function ($connection = null) use ($app) {
return $app->make(Factory::class)->connection($connection);
});
});

$this->app->alias(Dispatcher::class, DispatcherContract::class);
$this->app->alias(Dispatcher::class, QueueingDispatcherContract::class);
}
}

You can of course just inject AltThree\Bus\Dispatcher however if, like me, you prefer the idea of injecting interfaces, this method just works.

If you discover a better method, please let me know and I’ll update.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.