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