I’ll write how to separate config file in CakePHP3 version 3.0.9. As for FuelPHP, you can add setting file into app/config/development
, etc.
In the case when creating setting file in CakePHP3 for each environment, I’ll recommend you to create the directory config/development
and put setting files in it, and modify configure loading code.
Modified Code
Add one line with Configure::load
into config/bootstrap.php
. In the following code, it’s forth line. Suppoted that $environment
is set. You should define it somewhere.
1 2 3 4 5 6 7 |
try { Configure::config('default', new PhpConfig()); Configure::load('app', 'default', false); Configure::load($environment.'/app', 'default', true); } catch (\Exception $e) { die($e->getMessage() . "\n"); } |
At the forth line, it will merge setting file config/{$development}/app.php
into config/app.php
.
You can add any other conditional statement like if
or switch
.
Explanation
What does Configure
do?
According to bootstrap.php
, Configure::config
and Configure::load
seems to concern loading setting file. Let’s look at these functions.
Class Configure
is defined at vendor/cakephp/cakephp/src/Core/Configure.php
.
Configure::config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * Add a new engine to Configure. Engines allow you to read configuration * files in various formats/storage locations. CakePHP comes with two built-in engines * PhpConfig and IniConfig. You can also implement your own engine classes in your application. * * To add a new engine to Configure: * * ``` * Configure::config('ini', new IniConfig()); * ``` * * @param string $name The name of the engine being configured. This alias is used later to * read values from a specific engine. * @param ConfigEngineInterface $engine The engine to append. * @return void */ public static function config($name, ConfigEngineInterface $engine) { static::$_engines[$name] = $engine; } |
According to the comment, this method adds an engine. First parameter is the key to identify added engines, seconed one is the instance of the engine. You know, if you set the engine with the same name twice or more times, the setting is overwritten by last one.
bootstrap.php
adds engine new PhpConfig()
as default one, with Configure::config('default', new PhpConfig());
.
Configure::load
The method loads setting with the engine set with Configure::config
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/** * Loads stored configuration information from a resource. You can add * config file resource engines with `Configure::config()`. * * Loaded configuration information will be merged with the current * runtime configuration. You can load configuration files from plugins * by preceding the filename with the plugin name. * * `Configure::load('Users.user', 'default')` * * Would load the 'user' config file using the default config engine. You can load * app config files by giving the name of the resource you want loaded. * * ``` * Configure::load('setup', 'default'); * ``` * * If using `default` config and no engine has been configured for it yet, * one will be automatically created using PhpConfig * * @param string $key name of configuration resource to load. * @param string $config Name of the configured engine to use to read the resource identified by $key. * @param bool $merge if config files should be merged instead of simply overridden * @return mixed false if file not found, void if load successful. * @link http://book.cakephp.org/3.0/en/development/configuration.html#reading-and-writing-configuration-files */ public static function load($key, $config = 'default', $merge = true) { $engine = static::_getEngine($config); if (!$engine) { return false; } $values = $engine->read($key); if ($merge) { $values = Hash::merge(static::$_values, $values); } return static::write($values); } |
First parameter specify the file to be load. When you use /
, it means directory separator.
Second parameter specify the engine to handle settings, which is set with Configure::config
. The identify key of the engine is expressed as $name
in Configure::config
, but it’s $config
in here. On specifying the engine unset, return false
.
Third parameter defines to merge or to overwrite. I’ll set it true
, because common setting in all environments should be written in one file.
So, you can merge setting file with Configure::load(filepath, 'default', true)
. You know I didn’t explain the detail like Hash::merge
.
If load not existing file?
You can know what will occur when you try it. But let’s look at what procedure works. According to bootstrap.php
and Configure::load
, the setting file will be load with read
method in PhpConfig
. PhpConfig
is defined at vendor/cakephp/cakephp/src/Core/Configure.php
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * Read a config file and return its contents. * * Files with `.` in the name will be treated as values in plugins. Instead of * reading from the initialized path, plugin keys will be located using Plugin::path(). * * Setting a `$config` variable is deprecated. Use `return` instead. * * @param string $key The identifier to read from. If the key has a . it will be treated * as a plugin prefix. * @return array Parsed configuration values. * @throws \Cake\Core\Exception\Exception when files don't exist or they don't contain `$config`. * Or when files contain '..' as this could lead to abusive reads. */ public function read($key) { $file = $this->_getFilePath($key, true); $return = include $file; if (is_array($return)) { return $return; } if (!isset($config)) { throw new Exception(sprintf('Config file "%s" did not return an array', $key . '.php')); } return $config; } |
It says error will be occurred. The variable $config
seems a relic on the past