【问题标题】:understand laravel dependency injection了解 laravel 依赖注入
【发布时间】:2018-07-24 07:10:48
【问题描述】:

我想了解在 laravel 中自动依赖注入是如何工作的。我正在使用这个库 https://github.com/yedincisenol/dynamic-links 。它有一个绑定到 IoC 容器的服务提供者类

/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    $this->app->singleton('DynamicLinks', function ($app) {
        return new DynamicLinks($app['config']['dynamic-links']);
    });
}

解析类给了我一个库类的实例, $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']
        ]);
    }

似乎该类在没有配置的情况下被实例化,而不是使用提供者注册的实例。

【问题讨论】:

  • 或者配置返回null ...你的类引用DynamicLinks在你的控制器方法中指向什么?
  • @lagbox,类引用是库中的yedincisenol\DynamicLinks\DynamicLinks;类。这就是为什么$config 是null。

标签: php laravel dependency-injection


【解决方案1】:

这是因为单例被命名为'DynamicLinks',它解析为 DynamicLinks

并且控制器方法使用类DynamicLinks,它解析为 yedincisenol\DynamicLinks\DynamicLinks

换句话说,当您期望它作为控制器中的参数时,服务容器会尝试查找yedincisenol\DynamicLinks\DynamicLinks,并且由于它没有注册为单例,它只是尝试构造一个new。

-

几种解决方案:

1)

不要将类作为控制器参数,而是在其中将其解析为resolve('DynamicLinks')

2)

在app/Providers/AppServiceProvider的注册方法中,添加:

$this->app->singleton(\yedincisenol\DynamicLinks\DynamicLinks::class, function ($app) {
    return resolve('DynamicLinks');
});

3)

fork 或向包作者发送拉取请求,以实现类似于 2) 的内容

-

因此,简而言之,我建议选择 2) 选项,它可以确保您的控制器按预期工作。

【讨论】:

  • 也可以别名绑定到 FQCN
  • @lagbox true,但我忘记了它的确切语法,所以我分享了我 100% 知道会起作用的代码?
  • $this-&gt;app-&gt;alias('DynamicLinks', DynamicLinks::class)
  • @lagbox 很高兴知道,它存在于code 但不在documentation page ?
  • 明白了。非常感谢您的时间。你们俩。 :)
猜你喜欢
  • 2016-07-20
  • 2022-01-16
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多