在Symfony 4中的控制台/ Web中注入不同的实现

时间:2018-09-02 15:55:49

标签: php symfony dependency-injection symfony4

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

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

仅在运行CLI时,应该如何配置Kernel来注入控制台实现;在对Web服务器的常规请求中,如何使用第二个控制台实现?

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

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

但是不幸的是,它在APP_ENV=prod常规Kernel模式下应通过RequestUserIdProvider模式通过缓存覆盖。

谢谢。

1 个答案:

答案 0 :(得分:0)

我知道了。为此,我应该创建一个新的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实现。