Laravel Artisan 加载自定义服务提供商时出错 - 有没有办法避免这种情况?
Errors when Laravel Artisan Loads Custom Service Providers - is there a way to avoid this?
我已将自定义服务提供程序添加到 Laravel 应用程序并且服务提供程序运行良好。但是,Artisan 现在出现错误。当我删除服务提供者时,错误消失了(服务提供者在正常模式下运行时没有错误)。在这种情况下,错误与未加载的数据库驱动程序有关。 "Driver not found" 个错误。
显然,当 运行 在 Artisan 模式下时,它仍会加载所有服务提供者,即使一些依赖项(如数据库驱动程序)和其他依赖项未加载。
有人知道解决这个问题的方法吗?强制加载依赖项或防止有问题的服务提供者在 Artisan 模式下不加载?如果我能找到在 Artisan CLI 模式下检测其 运行 的方法,服务提供商的条件加载可能会起作用。
如果这里有帮助,where/how 服务提供商已注册:
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 模式下根本不加载数据库驱动程序。
如有任何反馈,我们将不胜感激。
提前致谢。
这有效:
if (\App::runningInConsole()){...
在这种情况下,我将它放在 class 的 __construct() 到 return null 之前 运行 bc 将它放在创建的服务提供商文件中其他意想不到的问题。不优雅,但可以无缝运行。
感谢@apokryfos 对 runningInConsole()
函数的建议。不知道那个。
如果我找到其他选项,我会 post 放在这里。仍在深入研究自定义服务提供商。 Laravel 的一个非常强大的功能,我刚刚开始。
相信你会想咨询一下boot
and register
:
的区别
As mentioned previously, within the register
method, you should only bind things into the service container. You should never attempt to register any event listeners, routes, or any other piece of functionality within the register method. Otherwise, you may accidentally use a service that is provided by a service provider which has not loaded yet.
而 boot
方法:
This method is called after all other service providers have been registered, meaning you have access to all other services that have been registered by the framework:
您的 return new Locations($app->request);
可能会进行数据库调用,但数据库服务提供商不一定准备好进入 register
函数。在boot
函数中,用你想要的数据初始化你之前注册的单例。
我已将自定义服务提供程序添加到 Laravel 应用程序并且服务提供程序运行良好。但是,Artisan 现在出现错误。当我删除服务提供者时,错误消失了(服务提供者在正常模式下运行时没有错误)。在这种情况下,错误与未加载的数据库驱动程序有关。 "Driver not found" 个错误。
显然,当 运行 在 Artisan 模式下时,它仍会加载所有服务提供者,即使一些依赖项(如数据库驱动程序)和其他依赖项未加载。
有人知道解决这个问题的方法吗?强制加载依赖项或防止有问题的服务提供者在 Artisan 模式下不加载?如果我能找到在 Artisan CLI 模式下检测其 运行 的方法,服务提供商的条件加载可能会起作用。
如果这里有帮助,where/how 服务提供商已注册:
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 模式下根本不加载数据库驱动程序。
如有任何反馈,我们将不胜感激。
提前致谢。
这有效:
if (\App::runningInConsole()){...
在这种情况下,我将它放在 class 的 __construct() 到 return null 之前 运行 bc 将它放在创建的服务提供商文件中其他意想不到的问题。不优雅,但可以无缝运行。
感谢@apokryfos 对 runningInConsole()
函数的建议。不知道那个。
如果我找到其他选项,我会 post 放在这里。仍在深入研究自定义服务提供商。 Laravel 的一个非常强大的功能,我刚刚开始。
相信你会想咨询一下boot
and register
:
As mentioned previously, within the
register
method, you should only bind things into the service container. You should never attempt to register any event listeners, routes, or any other piece of functionality within the register method. Otherwise, you may accidentally use a service that is provided by a service provider which has not loaded yet.
而 boot
方法:
This method is called after all other service providers have been registered, meaning you have access to all other services that have been registered by the framework:
您的 return new Locations($app->request);
可能会进行数据库调用,但数据库服务提供商不一定准备好进入 register
函数。在boot
函数中,用你想要的数据初始化你之前注册的单例。