Не удается создать экземпляр интерфейса при отправке задания из команды - PullRequest
1 голос
/ 17 июня 2019

Я написал собственную команду ремесленника в своем приложении Laravel, которая отправляет Job.Задание имеет сервисную зависимость в методе handle(), который разрешается с помощью механизма DI Laravel.Зависимость вводится правильно при нормальном запуске приложения, однако, когда я пытаюсь запустить php artisan my:command из терминала, я получаю ошибку, подобную этой:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (код: 0): Не удается создать экземпляр интерфейса App \ Services \ ABCInterface на /Users/john/code/laravel-project/app/Providers/ABCServiceProvider.php:28)

Вот мой register() метод ABCServiceProvider (Пожалуйста, прочтите также комментарии):

public function register()
{
    $this->app->bind(ABCInterface::class, function ($app) {
        if ($app->environment(['testing', 'local'])) {

            // The following log statement is executed when the app runs normally.
            // But isn't executed when the artisan command is run from the console.
            \Log::debug('Instantiating FakeABCService'); 

            // The following class implements ABCInterface.
            return new FakeABCService;

        } else {

            // The following class implements ABCInterface.
            return new ABCService;
        }
    });
}

Метод handle() отправляемого задания:

public function handle(ABCInterface $abcService)
{
    //
}

Наконец, метод handle()из класса команд ремесленника:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $post = Post::first();

    if ($this->confirm("Are you sure?")) {
        MyJob::dispatch($post);
        $this->comment('Done!');
        return;
    }
}

Кроме того, если я добавлю зависимость (подсказку типа) в метод handle() класса команд, laravel сможет разрешить ее.Это просто метод handle () класса Job, который не может разрешить зависимость.

Почему связанный класс разрешается в обычном потоке приложения, но не может быть разрешен при запуске команды?Как я могу это исправить?

1 Ответ

0 голосов
/ 17 июня 2019

Поскольку функция задания handle разрешена в очереди, попробуйте перезапустить работника очереди.

После внесения изменений в код необходимо перезапустить работника очереди, чтобы изменения вступили в силу в очереди.

Помните, что работники очереди являются долгоживущими процессамии сохраните загруженное состояние приложения в памяти.В результате они не заметят изменений в вашей кодовой базе после их запуска.Поэтому во время процесса развертывания обязательно перезапустите работников очереди.

Проверьте документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...