Я написал собственную команду ремесленника в своем приложении 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, который не может разрешить зависимость.
Почему связанный класс разрешается в обычном потоке приложения, но не может быть разрешен при запуске команды?Как я могу это исправить?