dusterio/laravel-aws-worker

Support for Lumen 7

lukascocula opened this issue · 3 comments

Hello,

there is check for Lumen version in LumenServiceProvider, line: 52, to perform registration of Worker.

My current version of Lumen is Lumen (7.2.1) (Laravel Components ^7.0), so it is not matching. It re-opens problem reported and fixed here

Error log:

Illuminate\Contracts\Container\BindingResolutionException: Unresolvable dependency resolving [Parameter #3 [ <required> callable $isDownForMaintenance ]] in class Illuminate\Queue\Worker in /var/app/current/vendor/illuminate/container/Container.php:1028

Could you please add supporting for Lumen 7? Thank you.

You can write your own service provider that takes away that logic:

<?php

namespace App\Providers;

use Dusterio\AwsWorker\Integrations\BindsWorker;
use Dusterio\PlainSqs\Sqs\Connector;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\QueueManager;
use Illuminate\Queue\Worker;
use Illuminate\Contracts\Debug\ExceptionHandler;

/**
 * Class CustomQueueServiceProvider
 * @package App\Providers
 */
class LumenSQSServiceProvider extends ServiceProvider
{
    use BindsWorker;

    /**
     * @return void
     */
    public function register()
    {
        if (function_exists('env') && ! env('REGISTER_WORKER_ROUTES', true)) return;

        $this->bindWorker();
        $this->addRoutes(isset( $this->app->router ) ? $this->app->router : $this->app );
    }

    /**
     * @param mixed $router
     * @return void
     */
    protected function addRoutes($router)
    {
        $router->post('/worker/schedule', 'Dusterio\AwsWorker\Controllers\WorkerController@schedule');
        $router->post('/worker/queue', 'Dusterio\AwsWorker\Controllers\WorkerController@queue');
    }

    /**
     * @return void
     */
    public function boot()
    {
        $this->app->singleton(QueueManager::class, function() {
            return new QueueManager($this->app);
        });

        $this->app->singleton(Worker::class, function () {
            $isDownForMaintenance = function () {
                return $this->app->isDownForMaintenance();
            };

            return new Worker(
                $this->app['queue'],
                $this->app['events'],
                $this->app[ExceptionHandler::class],
                $isDownForMaintenance
            );
        });
    }
}

And then in the bootstrap.php file:
$app->register(App\Providers\LumenSQSServiceProvider::class);

You can write your own service provider that takes away that logic:

<?php

namespace App\Providers;

use Dusterio\AwsWorker\Integrations\BindsWorker;
use Dusterio\PlainSqs\Sqs\Connector;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\QueueManager;
use Illuminate\Queue\Worker;
use Illuminate\Contracts\Debug\ExceptionHandler;

/**
 * Class CustomQueueServiceProvider
 * @package App\Providers
 */
class LumenSQSServiceProvider extends ServiceProvider
{
    use BindsWorker;

    /**
     * @return void
     */
    public function register()
    {
        if (function_exists('env') && ! env('REGISTER_WORKER_ROUTES', true)) return;

        $this->bindWorker();
        $this->addRoutes(isset( $this->app->router ) ? $this->app->router : $this->app );
    }

    /**
     * @param mixed $router
     * @return void
     */
    protected function addRoutes($router)
    {
        $router->post('/worker/schedule', 'Dusterio\AwsWorker\Controllers\WorkerController@schedule');
        $router->post('/worker/queue', 'Dusterio\AwsWorker\Controllers\WorkerController@queue');
    }

    /**
     * @return void
     */
    public function boot()
    {
        $this->app->singleton(QueueManager::class, function() {
            return new QueueManager($this->app);
        });

        $this->app->singleton(Worker::class, function () {
            $isDownForMaintenance = function () {
                return $this->app->isDownForMaintenance();
            };

            return new Worker(
                $this->app['queue'],
                $this->app['events'],
                $this->app[ExceptionHandler::class],
                $isDownForMaintenance
            );
        });
    }
}

And then in the bootstrap.php file:
$app->register(App\Providers\LumenSQSServiceProvider::class);

Yes, I already implemented my custom version fo LumenServiceProvider and register it instead of library provider. I'm reporting this to be resolved for other developers.

Yes, and I am just commenting to help less talented developers 👍