使用PHP-DI将参数注入构造函数

点对点

我正在努力使依赖项注入按我期望的方式工作-

我正在尝试注入一个类Api,该类需要知道特定用户要连接到哪个服务器。这意味着覆盖配置文件中的构造函数属性是无用的,因为每个用户可能都需要连接到不同的服务器。

class MyController {
    private $api;

    public function __construct(Api $api) {
        $this->api = $api;
    }
}

class Api {
     private $userServerIp;

     public function __construct($serverip) {
         $this->userServerIp = $serverip;
     }
}

如何为此类注入正确的参数?是否可以以某种方式覆盖该定义?有什么方法可以通过调用带有参数的容器来获取类吗?

为了(希望)阐明-我试图调用容器以实例化对象,同时将原本应包含在定义中的参数传递给该对象。

由于IP取决于用户,因此您可能具有执行user => serverIP映射的逻辑。它可能正在从db读取或基于简单的基于id的分片,或任何其他内容中读取。使用该逻辑,您可以构建为特定用户ApiFactory创建的服务Api

class ApiFactory {

    private function getIp(User $user) {
        // simple sharding between 2 servers based on user id
        // in a real app this logic is probably more complex - so you will extract it into a separate class

        $ips = ['api1.example.com', 'api2.example.com'];
        $i = $user->id % 2;
        return $ips[$i];
    }

    public function createForUser(User $user) {
        return new Api($this->getIp($user);
    }
}

现在,Api您可以注入而不是注入到控制器中ApiFactory(假设您的控制器知道需要其Api实例的用户)

class MyController {
    private $apiFactory;

    public function __construct(ApiFactory $apiFactory) {
        $this->apiFactory = $apiFactory;
    }

    public function someAction() {
        $currentUser = ... // somehow get the user - might be provided by your framework, or might be injected as well
        $api = $this->apiFactory->createForUser($currentUser);
        $api->makeSomeCall();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

php-di中的多个构造函数参数注入

如何使用构造函数参数将Inject()注入类?

使用Unity注入构造函数参数

PHP-DI:注入构造函数的接口无法正确解析

PHP-Laravel依赖注入:将参数传递给依赖构造函数

将参数传递给make时如何使用Laravel的自动构造函数注入?

使用未知构造函数参数的Unity注入实例

在构造函数中使用多个接口作为参数的依赖注入

使用 Hilt 进行依赖注入时如何将运行时参数传递给 ViewModel 的构造函数?

使用 Simple Injector 将配置类注入构造函数

AngularJS-使用构造函数将数据注入DOM

使用注解将bean的集合注入构造函数

如何使用Unity将类型而不是实例注入构造函数

使用 Guice 将特定对象注入特定构造函数

使用Unity C#将父母注入复合构造函数

在构造函数注入期间,Unity DI容器能否识别正在构造的类型,并在解析引用时使用它?

PHP-DI 按名称注入参数

将参数传递给PHP中的父类构造函数?

MassTransit和.NET Core DI-如何使用无参数构造函数解决依赖关系?

在.NET Core中使用不同的构造函数参数(DI和非DI)注册IHostedService的多个实例

使用Guice将参数传递给构造函数

构造函数使用参数调用构造函数

使用命名参数在Kotlin中进行Dagger 2构造函数注入

简单注入器使用不同的构造函数参数注册相同的接口

使用NInject在WPF中注入没有无参数构造函数的viewmodel类

简单注入器:使用构造函数参数注册开放泛型类型

Dagger无法使用Dagger Android在ViewModel的构造函数上注入类型为interface的参数

为什么我需要一个无参数的构造函数使用内CDI ApplicationScoped豆构造方法注入?

我正在尝试使用ASP.Net依赖注入将服务注入到构造函数中,但收到一条消息,提示我空白的构造函数还不够