Commit bd70ac84 by Qiang Xue

Fixes #2054: Added support for using custom application configuration with the…

Fixes #2054: Added support for using custom application configuration with the console command runner
parent afda91e0
...@@ -58,16 +58,27 @@ exit($exitCode); ...@@ -58,16 +58,27 @@ exit($exitCode);
``` ```
This script is a part of your application so you're free to adjust it. The `YII_DEBUG` constant can be set `false` if you do This script is a part of your application so you're free to adjust it. The `YII_DEBUG` constant can be set `false` if you do
not want to see stacktrace on error and want to improve overall performance. In both basic and advanced application not want to see stack trace on error and want to improve overall performance. In both basic and advanced application
templates it is enabled to provide more developer-friendly environment. templates it is enabled to provide more developer-friendly environment.
Configuration Configuration
------------- -------------
As can be seen in the code above, console application uses its own config files named `console.php` so you need to As can be seen in the code above, console application uses its own config files named `console.php`. In this file,
configure database connection and the rest of the components you're going to use there in that file. If web and console you should specify how to configure various application components and properties.
application configs have a lot in common it's a good idea to move matching parts into their own config files as it was
done in advanced application template. If your Web application and the console application share a lot of configurations, you may consider moving the common
part into a separate file, and include this file in both of the application configurations, just as what is done
in the "advanced" application template.
Sometimes, you may want to run a console command using an application configuration that is different from the one
specified in the entry script. For example, you may want to use the `yii migrate` command to upgrade your
test databases which are configured in each individual test suite. To do so, simply specify the custom application configuration
file via the `appconfig` option, like the following,
```
yii <route> --appconfig=path/to/config.php ...
```
Creating your own console commands Creating your own console commands
......
...@@ -93,6 +93,7 @@ Yii Framework 2 Change Log ...@@ -93,6 +93,7 @@ Yii Framework 2 Change Log
- Enh #2008: `yii message/extract` is now able to save translation strings to database (kate-kate, samdark) - Enh #2008: `yii message/extract` is now able to save translation strings to database (kate-kate, samdark)
- Enh #2043: Added support for custom request body parsers (danschmidt5189, cebe) - Enh #2043: Added support for custom request body parsers (danschmidt5189, cebe)
- Enh #2051: Do not save null data into database when using RBAC (qiangxue) - Enh #2051: Do not save null data into database when using RBAC (qiangxue)
- Enh #2054: Added support for using custom application configuration with the console command runner (qiangxue)
- Enh #2079: - Enh #2079:
- i18n now falls back to `en` from `en-US` if message translation isn't found (samdark) - i18n now falls back to `en` from `en-US` if message translation isn't found (samdark)
- View now falls back to `en` from `en-US` if file not found (samdark) - View now falls back to `en` from `en-US` if file not found (samdark)
......
...@@ -54,6 +54,11 @@ use yii\base\InvalidRouteException; ...@@ -54,6 +54,11 @@ use yii\base\InvalidRouteException;
class Application extends \yii\base\Application class Application extends \yii\base\Application
{ {
/** /**
* The option name for specifying the application configuration file path.
*/
const OPTION_APPCONFIG = 'appconfig';
/**
* @var string the default route of this application. Defaults to 'help', * @var string the default route of this application. Defaults to 'help',
* meaning the `help` command. * meaning the `help` command.
*/ */
...@@ -68,6 +73,42 @@ class Application extends \yii\base\Application ...@@ -68,6 +73,42 @@ class Application extends \yii\base\Application
*/ */
public $controller; public $controller;
/**
* @inheritdoc
*/
public function __construct($config = [])
{
$config = $this->loadConfig($config);
parent::__construct($config);
}
/**
* Loads the configuration.
* This method will check if the command line option [[OPTION_APPCONFIG]] is specified.
* If so, the corresponding file will be loaded as the application configuration.
* Otherwise, the configuration provided as the parameter will be returned back.
* @param array $config the configuration provided in the constructor.
* @return array the actual configuration to be used by the application.
*/
protected function loadConfig($config)
{
if (!empty($_SERVER['argv'])) {
$option = '--' . self::OPTION_APPCONFIG . '=';
foreach ($_SERVER['argv'] as $param) {
if (strpos($param, $option) !== false) {
$path = substr($param, strlen($option));
if (!empty($path) && is_file($path)) {
return require($path);
} else {
die("The configuration file does not exist: $path\n");
}
}
}
}
return $config;
}
/** /**
* Initialize the application. * Initialize the application.
*/ */
......
...@@ -66,7 +66,9 @@ class Request extends \yii\base\Request ...@@ -66,7 +66,9 @@ class Request extends \yii\base\Request
foreach ($rawParams as $param) { foreach ($rawParams as $param) {
if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) { if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) {
$name = $matches[1]; $name = $matches[1];
$params[$name] = isset($matches[3]) ? $matches[3] : true; if ($name !== Application::OPTION_APPCONFIG) {
$params[$name] = isset($matches[3]) ? $matches[3] : true;
}
} else { } else {
$params[] = $param; $params[] = $param;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment