我已将自定义服务提供商添加到Laravel应用,服务提供商运行良好。但是,Artisan现在出错了。当我删除服务提供程序时,错误消失(当服务提供程序以正常模式运行时没有错误)。在这种情况下,错误与未加载的DB驱动程序有关。 “找不到驱动程序”错误。
显然,在Artisan模式下运行时,它仍会加载所有服务提供程序,即使某些依赖项如DB Drivers和其他依赖项未加载。
有没有人知道解决这个问题的方法?强制依赖项加载或防止违规服务提供程序无法以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模式下根本不加载数据库驱动程序。
任何反馈都将不胜感激。
提前致谢。
答案 0 :(得分:1)
这有效:
if (\App::runningInConsole()){...
在这种情况下,我将它放在类的__construct()中,以便在运行bc之前返回null,将其置于服务提供程序文件中,从而创建其他意外问题。不优雅,但它无缝地工作。
感谢@apokryfos关于runningInConsole()
功能的建议。我不知道那个。
如果我找到其他选项,我会在这里发布。仍在深入挖掘定制服务提供商。 Laravel的一个非常强大的功能,我刚刚进入。
答案 1 :(得分:1)
我相信你想要查阅boot
and register
之间的区别:
如前所述,在
register
方法中,您应该只将事物绑定到服务容器中。您永远不应尝试在register方法中注册任何事件侦听器,路由或任何其他功能。 否则,您可能会意外使用尚未加载的服务提供商提供的服务。
boot
方法:
在所有其他服务提供商注册之后调用此方法,这意味着您可以访问框架注册的所有其他服务:
您的return new Locations($app->request);
可能会进行数据库调用,但数据库服务提供商不一定准备进入register
函数。在boot
函数中,使用您想要的数据初始化以前注册的单例。