如何在Symfony2控制台命令中设置环境

希望有一个简单的问题 – 如何在Symfony2中运行一个控制台命令时指定使用哪个环境。 我已经创build了一些命令,但是我希望在我的登台服务器和我的生产服务器上的“prod”环境(不同的环境定义不同的数据库连接)时在我的“登台”环境中运行它们。 我如何configuration和传递这个信息到我的控制台命令?

你有两个选项可以帮助你。 您可以使用--env标志指定控制台将运行的环境,并使用--no-debug禁用debugging模式。

php app/console --env=staging your:console:commandphp app/console --env=prod your:console:command应该做你要找的东西(控制台运行在dev环境默认debugging)。

您可以查看app/console文件的代码以获取更多信息。

你也可以使用SYMFONY_ENV环境variables来设置一个不同于'dev'的默认环境(例如在~/.bash_profile export SYMFONY_ENV=prod

要回答@croca的问题,扩展@FrancescRosàs发布的内容,以及@Problematicbuild议。

如果你在应用程序/控制台你应该看到$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');

所有这一切都是检查传递给控制台的input参数--env-e ,检查来自getenv('SYMFONY_ENV')的默认值,或者将它设置为dev如果两者都不提供)。

然后传递给$kernel = new AppKernel($env, $debug);

您可以直接对应用程序/控制台进行更改以实现应用程序的特定function,或者将应用程序/控制台复制到单独的文件(如app / exec),然后处理$ envvariables,以确定所需的环境。

简单的例子: app / exec

 #!/usr/bin/env php <?php /** * disabled debug mode, * set environment based on requesting address being local * otherwise the server's 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的指令可以在这里find: http ://symfony.com/doc/current/components/console/introduction.html

官方文件说:

默认情况下,控制台命令在开发环境中运行,您可能需要对某些命令进行更改。

因此,正如@Problematicbuild议的那样,您可以使用标志“–env = your_env ”或其快捷键“-e your_env ”为您的命令指定环境。

我想知道是否可以强制命令的默认环境。 我的意思是,不必使用标志。 任何想法?

也许你可以看看cache:clear命令的实现。 这可能会给你一些关于如何从命令中select环境的线索。

 app/console help cache:clear 

还有另外一个变种,虽然不太方便,但也可以和composer

 SYMFONY_ENV=prod app/console cache:clear