在 Symfony 4 的 console/web 中注入不同的实现

Injecting different implementations in console/web in Symfony 4

我有一个接口 UserIdProvider,它有两个实现:

ConsoleUserIdProvider - it takes user id from CLI input option
RequestUserIdProvider - it comes from {userId} parameter in route

当我只使用 运行 CLI 时,我应该如何配置 Kernel 以注入控制台实现,以及当它是对 Web 服务器的常规请求时如何使用第二个?

我为我加载的 console.php 创建了单独的 ConsoleKernel extends Kernel

$loader->load($confDir . '/console_services.yml');

但不幸的是,它在 APP_ENV=prod 模式常规 Kernel 中通过缓存覆盖,其中应该使用 RequestUserIdProvider

提前致谢。

我明白了。为此,我应该创建新的 cli 环境。

  1. 我删除了加载自定义 yml 文件的 ConsoleKernel。没必要。
  2. 我重命名了 console_services.yml 以遵循 Symfony 的做法,在我的例子中应该是:services_cli.yml。我的控制台特定实现放在那里。
  3. 我还更改了 console.php 以在 cli 环境中禁用调试模式,例如 prod:
$notLikeProdEnv = !in_array($env, ["prod", "cli"], true);
$debug = ($_SERVER['APP_DEBUG'] ?? $notLikeProdEnv) && !$input->hasParameterOption(['--no-debug', '']);
  1. 多亏了我 运行 php console --env=cli 我只能看到特定于 cli 环境的命令以及我的 ConsoleUserIdProvider 实现。