Я добавил настраиваемого поставщика услуг в приложение Laravel, и он работает нормально. Однако теперь Artisan получает ошибку. Когда я удаляю поставщика услуг, ошибка исчезает (нет ошибок, когда поставщик услуг работает в обычном режиме). В этом случае ошибка связана с тем, что драйверы БД не загружаются. Ошибки «Драйвер не найден».

По-видимому, при работе в режиме Artisan он по-прежнему загружает всех поставщиков услуг, даже если некоторые из зависимостей, таких как драйверы БД и другие зависимости, не загружены.

Кто-нибудь знает способ обойти это? Заставить зависимости загружаться или предотвратить загрузку проблемных поставщиков услуг в режиме Artisan? Возможно, условная загрузка поставщиков услуг сработает, если я найду способ обнаружить его работу в режиме Artisan CLI.

Если это поможет, вот где и как зарегистрирован поставщик услуг:

public function register()
{
    $this->app->singleton(Locations::class, function ($app) {
        return new Locations($app->request);
    });
}

Сообщение об ошибке:

 could not find driver (SQL: select * from...

По-видимому, провайдер нестандартных услуг загружается и запускается до того, как ресурсы драйвера БД загружены и доступны в режиме Artisan CLI - не имея этой проблемы в обычном режиме браузера. Либо это, либо Artisan вообще не загружает драйверы БД в режиме CLI.

Любая обратная связь будет оценена.

Заранее спасибо.

1
G-Man 14 Мар 2018 в 02:09

2 ответа

Лучший ответ

Это сработало:

if (\App::runningInConsole()){...

В этом случае я поместил его в __construct () класса, чтобы вернуть значение null, прежде чем он запустил bc, размещение его в файле поставщика услуг создало другие неожиданные проблемы. Не элегантно, но работает без проблем.

Спасибо @apokryfos за предложение по функции runningInConsole(). Не знал об этом.

Если найду другие варианты, опубликую их здесь. Все еще углубляюсь в пользовательских поставщиков услуг. Очень мощная функция Laravel, в которую я только начинаю.

2
G-Man 14 Мар 2018 в 00:15

Я полагаю, вы захотите ознакомиться с различием между boot и register:

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

В то время как метод boot:

Этот метод вызывается после того, как все другие поставщики услуг были зарегистрированы, то есть у вас есть доступ ко всем другим услугам, которые были зарегистрированы фреймворком:

Ваш return new Locations($app->request); предположительно выполняет вызовы базы данных, но поставщик службы базы данных не обязательно готов перейти к функции register. В функции boot инициализируйте ранее зарегистрированный синглтон нужными данными.

1
ceejayoz 14 Мар 2018 в 00:38