我需要你的建议,以避免在Symfony Dependecy注入项目中重复服务。
该项目的目标是创建Symfony控制台命令来管理远程服务的对象。服务公开用于管理对象的 API。
远程服务为我提供了两个不同的实例:生产实例和沙盒实例。
要执行的命令示例包括:
- 在实例 X 上创建用户
- 在实例 X 上创建组
- 显示两个实例的用户之间的差异
- 在两个实例之间同步用户
我开始创建一个类来包装服务 API,并使用具有不同身份验证数据的同一类为两个实例创建两个服务:
services:
sandbox_instance:
class: APIClient
arguments: ["sandbox_account", "sandbox_user", "sandbox_password"]
prod_instance:
class: APIClient
arguments: ["prod_account", "prod_user", "prod_password"]
但后来,我创建了一些"管理器"来拥有不同操作的逻辑。 例如,我创建了一个用户管理器和一个组管理器。 这些服务依赖于"ApiClient"服务,所以我最终复制了所有管理器,一个用于生产,一个用于沙箱:
services:
....
user_manager_sandbox:
class: UserManager
arguments: ['@sandbox_instance']
user_manager_prod:
class: UserManager
arguments: ['@prod_instance']
group_manager_sandbox:
class: GroupManager
arguments: ['@sandbox_instance']
group_manager_prod:
class: GroupManager
arguments: ['@prod_instance']
我确定这不是使用服务容器的正确方法,但我无法弄清楚如何定义和获取"参数化"服务。
在命令代码中,我的目标是调用:
$prodUserManager = $container->get('user_manager', 'prod');
$sandboxUserManager = $container->get('user_manager', 'sandbox');
并避免重复服务的定义。
当然,我不能简单地将身份验证数据放在配置参数中并根据我要使用的实例加载不同的配置,因为有些命令我需要同时使用两个实例(例如迁移和 diff 命令(。
我怎样才能以正确的方式做到这一点?最佳实践是什么?
提前非常感谢你。 干杯 马迪奥
我最终使用服务来切换环境并在服务定义中使用表达式语言:
环境开关类:
<?php
class EnvSwitch
{
private $currentEnv;
public function getCurrentEnv(){
if($this->currentEnv == null)
throw new Exception('No environment selected yet.');
return $this->currentEnv;
}
public function setCurrentEnv(string $env){
$this->currentEnv = $env;
}
public function getCurrentEnvServiceName(){
return $this->getCurrentEnv().'_instance';
}
}
服务定义:
services:
sandbox_instance:
class: APIClient
arguments: ["sandbox_account", "sandbox_user", "sandbox_password"]
prod_instance:
class: APIClient
arguments: ["prod_account", "prod_user", "prod_password"]
env_switch:
class: EnvSwitch
user_manager:
class: UserManager
arguments: ["@=service(service('env_switch').getCurrentEnvServiceName())"]
shared: false
group_manager:
class: GroupManager
arguments: ["@=service(service('env_switch').getCurrentEnvServiceName())"]
shared: false
控制台命令中的用法:
...
$this->get('env_switch')->setCurrentEnv('sandbox');
$userManager = $this->get('user_manager');
...
您如何看待此解决方案? 马迪奥