【问题标题】:Injecting the right config with Auryn使用 Auryn 注入正确的配置
【发布时间】:2018-09-06 14:50:23
【问题描述】:

我有一个用例,我们使用 Auryn 来连接我们的类,我需要根据参数的值注入不同的配置类。

Auryn 的文档给出了一个注入依赖的例子:

interface Engine {}
class V8 implements Engine {}
class Car {
    private $engine;
    public function __construct(Engine $engine) {
        $this->engine = $engine;
    }
}

$injector = new Auryn\Injector;

// Tell the Injector class to inject an instance of V8 any time
// it encounters an Engine type-hint
$injector->alias('Engine', 'V8');

$car = $injector->make('Car');
var_dump($car instanceof Car); // bool(true)

但是如果我也有呢

class Hybrid implements Engine

我需要根据具体情况确定在 Auryn 产生依赖关系时我是从 V8 还是 Hybrid 中获得它?

这是一个基于 Auryn 文档的人为示例,在实际代码中,该类需要在构造时传递配置。但是基本问题是一样的。

【问题讨论】:

    标签: php dependency-injection auryn


    【解决方案1】:

    你可以像这样使用$injector->define()

    <?php
    $injector = new Auryn\Injector;
    $injector->define('Car', ['engine' => 'Hybrid']);
    $car = $injector->make('Car');
    
    var_dump($car instanceof Car); // true
    

    链接:https://github.com/rdlowrey/auryn#injection-definitions

    【讨论】:

    • 但是所有 Car 对象都会注入 Hybrid 引擎对象。我需要一些汽车配备混合动力发动机,而另一些汽车配备 V8 发动机。
    • 您可以创建子类并为每个子类注入正确的依赖项。
    • 理论上在某些情况下这是一种选择,但这并不是很优雅,创建类纯粹是为了让 DI 以您想要的方式工作。在某些情况下你不能这样做
    • 也许您可以在需要 V8 时即时使用定义 github.com/rdlowrey/… $car = $injector-&gt;make('Car', ['engine' =&gt; 'Hybrid']); 只需注入 $car = $injector-&gt;make('Car', ['engine' =&gt; 'V8']);
    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 2018-12-03
    • 2019-11-14
    • 1970-01-01
    • 2020-05-11
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多