通过在 services.yaml 中添加环境参数作为条件来实现别名接口

问题描述 投票:0回答:1

我有两个实现相同接口的存储库。

  1. 应用程序\存储库\RepoA
  2. 应用程序\存储库\旧版\RepoA

我还添加了 USE_LEGACY 环境变量(也作为 services.yaml 中的参数):

parameters:
    use_legacy: '%env(bool:USE_LEGACY)%'

我想要实现的是,如果 USE_LEGACY 设置为 true,则调用时的接口将调用旧版存储库,如果不是,它将调用其他(非旧版)存储库。

到目前为止我尝试过:

services:
      App\Repository\Interface\RepoAInterface: 
        alias: '@=service("App\Repository" ~ (parameter("use_legacy:") == false ? "\\RepoA" : "\Legacy\\RepoA"))'

但这不起作用,

有什么解决办法吗?

仅供参考,我正在使用 Symfony 6.4 和 PHP 8.3

感谢您的建议!

php symfony
1个回答
0
投票

使用factory类来动态构建服务:

services:
   App\Repository\Interface\RepoAInterface:
       factory: '@App\Factory\RepoAFactory'
       arguments:
           - '%use_legacy%'
use App\Repository\RepoA;
use App\Repository\Legacy\RepoA as LegacyRepoA;
use App\Repository\Interface\RepoAInterface;
use Psr\Container\ContainerInterface;

class RepoAFactory
{
    public function __construct(
        #[AutowireLocator([
            RepoA::class,
            LegacyRepoA::class,
        ])]
        private ContainerInterface $locator,
    ) {
    }

    public function __invoke(bool $useLegacy): RepoAInterface {
        return $useLegacy === true
            ? $this->locator->get(LegacyRepoA::class)
            : $this->locator->get(RepoA::class);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.