Я добавил настраиваемого поставщика услуг в приложение 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.
Любая обратная связь будет оценена.
Заранее спасибо.
2 ответа
Это сработало:
if (\App::runningInConsole()){...
В этом случае я поместил его в __construct () класса, чтобы вернуть значение null, прежде чем он запустил bc, размещение его в файле поставщика услуг создало другие неожиданные проблемы. Не элегантно, но работает без проблем.
Спасибо @apokryfos за предложение по функции runningInConsole()
. Не знал об этом.
Если найду другие варианты, опубликую их здесь. Все еще углубляюсь в пользовательских поставщиков услуг. Очень мощная функция Laravel, в которую я только начинаю.
Я полагаю, вы захотите ознакомиться с различием между boot
и register
:
Как упоминалось ранее, внутри метода
register
вы должны только привязывать вещи к сервисному контейнеру. Вы никогда не должны пытаться регистрировать какие-либо прослушиватели событий, маршруты или любую другую часть функциональности в методе register. В противном случае вы можете случайно воспользоваться услугой, предоставляемой поставщиком услуг, но еще не загруженной.
В то время как метод boot
:
Этот метод вызывается после того, как все другие поставщики услуг были зарегистрированы, то есть у вас есть доступ ко всем другим услугам, которые были зарегистрированы фреймворком:
Ваш return new Locations($app->request);
предположительно выполняет вызовы базы данных, но поставщик службы базы данных не обязательно готов перейти к функции register
. В функции boot
инициализируйте ранее зарегистрированный синглтон нужными данными.
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.