我正在努力使依赖项注入按我期望的方式工作-
我正在尝试注入一个类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] 删除。
我来说两句