Внедрение различных реализаций в console / web в Symfony 4 - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть интерфейс UserIdProvider, который имеет две реализации:

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

Как мне настроить Kernel для внедрения консоли, когда я запускаю только CLI, и как использовать второй, когда это обычный запрос к веб-серверу?

Я создал отдельный ConsoleKernel extends Kernel для console.php, где я загружаю:

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

Но, к сожалению, он переопределяет через кеш в обычном режиме APP_ENV=prod Kernel, где предполагается использовать RequestUserIdProvider.

Заранее спасибо.

1 Ответ

0 голосов
/ 02 сентября 2018

Я понял это. Я должен создать новую cli среду для этой цели.

  1. Я удалил ConsoleKernel, который загружает пользовательский файл yml. Это не обязательно.
  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.
...