Php 理解laravel依赖注入

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

我想了解自动依赖性注入在laravel中是如何工作的。我正在使用这个图书馆。它有一个绑定到IoC容器的服务提供者类

/**
 * 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很好知道,它出现在中,但不在上。非常感谢您抽出时间。你们两个。:)