Php 理解laravel依赖注入
我想了解自动依赖性注入在laravel中是如何工作的。我正在使用这个图书馆。它有一个绑定到IoC容器的服务提供者类Php 理解laravel依赖注入,php,laravel,dependency-injection,Php,Laravel,Dependency Injection,我想了解自动依赖性注入在laravel中是如何工作的。我正在使用这个图书馆。它有一个绑定到IoC容器的服务提供者类 /** * Register the service provider. * * @return void */ public function register() { $this->app->singleton('DynamicLinks', function ($app) { return new DynamicLinks($app
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('DynamicLinks', function ($app) {
return new DynamicLinks($app['config']['dynamic-links']);
});
}
解析这个类给了我一个library类的实例,
$dynamicLinks=resolve('dynamicLinks')代码>
根据文档,如果控制器方法中暗示了类型,则类是自动注入的
或者,更重要的是,您可以简单地“键入提示”
类的构造函数中由
容器,包括控制器、事件侦听器、队列作业、,
中间件等等。实际上,大多数对象都是这样的
应该由容器解决
这是我的控制器方法:
public function getLink(Request $request, DynamicLinks $dynamicLinks) {
// other stuffs
}
但问题是,它没有在注入的实例中获取配置文件,并从库中抛出ConfigException
。
这是类的构造函数
public function __construct(array $config = null)
{
if ($config == null) {
$config = require_once 'config.php';
}
if ($config == null || !isset($config['api_key']) || strlen($config['api_key']) < 1) {
throw new ConfigException;
}
$this->config = $config;
$this->client = new Client([
'base_uri' => 'https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=' . $config['api_key']
]);
}
公共函数构造(数组$config=null)
{
如果($config==null){
$config=require_once'config.php';
}
如果($config==null | |!isset($config['api_key'])| | strlen($config['api_key'])<1){
抛出新的配置异常;
}
$this->config=$config;
$this->client=新客户端([
'基本uri'=>'https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key='.$config['api_key']
]);
}
类似乎是在没有配置的情况下实例化的,而不是使用提供程序注册的实例 这是因为单例名为
“DynamicLinks”
,解析为
dynamicLink
控制器方法使用类dynamicLink
,该类解析为
yedincisenol\DynamicLinks\DynamicLinks
换句话说,当您希望它作为控制器中的参数时,服务容器会尝试查找yedincisenol\DynamicLinks\DynamicLinks
,因为它没有注册为单例,所以它只会尝试构造一个新的
单例
-
几种解决方案:
(一)
不要将该类作为控制器参数,而是在其内部将其解析为resolve('DynamicLinks')
(二)
在app/Providers/AppServiceProvider
的注册方法中,添加:
$this->app->singleton(\yedincisenol\DynamicLinks\DynamicLinks::class, function ($app) {
return resolve('DynamicLinks');
});
(三)
fork或向包作者发送pull请求,以按照2)
-
因此,简而言之,我建议选择选项
2)
,这将确保您的控制器按预期工作。或者配置返回null
。。。另外,您的类引用DynamicLinks
在控制器方法中指向什么?@lagbox,类引用是yedincisenol\DynamicLinks\DynamicLinks代码>库中的类。这就是为什么$config
为null
。也可以将绑定别名为FQCN@lagbox是的,但我忘记了它的确切语法,所以我分享了我100%知道可以使用的代码$this->app->alias('DynamicLinks',DynamicLinks::class)
@lagbox很好知道,它出现在中,但不在上。非常感谢您抽出时间。你们两个。:)