Как настроить среду в консоли Symfony2

Надеюсь, простой вопрос - как определить, какую среду использовать при запуске консольной команды в Symfony2. Я создал несколько команд, однако я хотел бы запускать их в контексте моей "промежуточной" среды, когда на моем промежуточном сервере и моей среде "prod", когда на моем рабочем сервере (разные среды определяют разные подключения к базе данных). Как настроить и передать эту информацию в мою консольную команду?

Ответ 1

У вас есть два варианта, которые помогут вам. Вы можете указать среду, в которой консоль будет работать с флагом --env, и использовать --no-debug для отключения режима отладки.

php app/console --env=staging your:console:command или php app/console --env=prod your:console:command должны делать то, что вы ищете (консоль запускается в среде dev с отладкой по умолчанию).

Вы можете посмотреть код файла app/console для получения дополнительной информации.

Ответ 2

Вы также можете использовать переменную среды SYMFONY_ENV для установки среды по умолчанию, отличной от "dev" (например, export SYMFONY_ENV=prod в ~/.bash_profile)

Ответ 3

Чтобы ответить на вопрос @croca, нужно было расширить, что опубликовано @Francesc Rosàs, и как предложено @Problematic.

Если вы посмотрите в приложении/консоли, вы должны увидеть $env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');

Все это проверит входные аргументы, переданные в консоль для --env или -e, проверяет значение по умолчанию от getenv('SYMFONY_ENV') или устанавливает его в dev, если ни один из них не указан.

Затем он передается в $kernel = new AppKernel($env, $debug);

Вы можете по существу либо вносить изменения непосредственно в приложение/консоль, чтобы достичь своей конкретной функции приложения, либо скопировать приложение/консоль в отдельный файл, например app/exec, а затем обработать переменную $env, как вы предпочитаете определять желаемую среду.

Простой пример: приложение /exec

#!/usr/bin/env php
<?php
 /**
  * disabled debug mode, 
  * set environment based on requesting address being local 
  * otherwise the server IP address
  * be sure to perform at least chmod(750) on the file to ensure it is executable
  * otherwise it must be prefixed with your php executable
  */     

set_time_limit(0);

require_once __DIR__.'/bootstrap.php.cache';
require_once __DIR__.'/AppKernel.php';

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;

$input = new ArgvInput();
$env = ($_SERVER['REMOTE_ADDR'] === '127.0.0.1' || $_SERVER['REMOTE_ADDR'] === '::1' ? 'dev' :
    ($_SERVER['SERVER_ADDR'] === '192.168.2.1' ? 'test' : 'prod')
);
$kernel = new AppKernel($env, false);
$application = new Application($kernel);
$application->run($input);

Затем вызовите php app/exec namespace:command arguments --flags

Кроме того, вы можете обрабатывать собственное приложение, а не использовать AppKernel приложения/консоли - инструкции из Symfony можно найти здесь: http://symfony.com/doc/current/components/console/introduction.html

Ответ 4

В официальной документации говорится:

По умолчанию консольные команды запускаются в среде dev, и вы можете изменить это для некоторых команд.

Итак, поскольку @Problematic предлагает, вы можете указать среду для своей команды, используя флаг "--env = your_env" или его ярлык "-e your_env".

Интересно, можно ли принудительно настроить среду по умолчанию для команды. Я имею в виду, без необходимости использовать флаги. Любая идея?

Ответ 5

Возможно, вы можете посмотреть на реализацию кеша: очистить команду. Это может дать вам некоторые подсказки о том, как выбрать среду из команды.

app/console help cache:clear

Ответ 6

Существует еще один вариант, который не очень удобен, но работает также с composer

SYMFONY_ENV=prod app/console cache:clear