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

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

我有一个接口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应该被使用。

提前致谢。

php symfony dependency-injection symfony4
1个回答
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实现。
© www.soinside.com 2019 - 2024. All rights reserved.