【问题标题】:Injecting different implementations in console/web in Symfony 4在 Symfony 4 的控制台/Web 中注入不同的实现
【发布时间】:2018-09-02 15:55:48
【问题描述】:

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

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

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

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

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

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

提前致谢。

【问题讨论】:

    标签: php symfony dependency-injection symfony4


    【解决方案1】:

    我想通了。我应该为此创建新的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 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2019-11-09
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多