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