Laravel Artisan加载定制服务提供商时的错误 - 有没有办法避免这种情况?

时间:2018-03-13 23:09:06

标签: php laravel artisan service-provider

我已将自定义服务提供商添加到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模式下根本不加载数据库驱动程序。

任何反馈都将不胜感激。

提前致谢。

2 个答案:

答案 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函数中,使用您想要的数据初始化以前注册的单例。