This extension allows you to store special config entries needed by your application into a database.
Resources ¶
Documentation ¶
Requirements ¶
- Yii 1.0 or above
Installation ¶
- Extract the release file under
protected/extensions
- Modify your application config for the use of the extension
...
'components' => array(
...
'config' => array(
'class' => 'application.extensions.EConfig',
),
...
),
...
Configuration ¶
In order to use this extension, you have to make sure a database component is configured in your config. Also for better performance a configured cache component is a good idea.
These properties are available and can be set in the config:
configTableName
Defaults to "Config". This is the name of the database table used to store the config entries.autoCreateConfigTable
Defaults to true. Wether the database table should be auto-created. For performance reasons you should turn this off once the table got created.connectionID
Defaults to "db". The ID of the database component.cacheID
Defaults to false. The ID of the cache component. If set to false, no caching will be performed.strictMode
Available since version 1.1. Defaults to true. If this is set to false, you can get/set entries even if the entry is not yet present in the database.
Usage ¶
By default the created database table is empty. That means you can't get or set any config entry. In order to make it work, you have to add every needed config entry to the database (for example with PHPMyAdmin). Since the extension stores values serialized, you have to make sure you add the needed entries with NULL
as value. After that you can safely get or set your entries.
Since version 1.1 you can set the new strictMode
property to false in order to get or set a value even if the entry is not present in the database. That works as follows: If you try to get an entry which is not present, NULL is returned. If you try to set an entry which is not present, the entry will be auto-inserted into the database. Please note that if you have a typo in your $key value when getting an entry, NULL is returned instead of a thrown exception. I suggest to just leave strict mode enabled.
To get an entry:
$var = Yii::app()->config->get($key);
To set an entry:
Yii::app()->config->set($key, $value);
Since values are stored serialized, it's no problem to work with booleans or arrays.
Change Log ¶
January 8, 2010 ¶
- Version 1.11: Fixed small bug regarding serialization
January 6, 2010 ¶
- Version 1.1: Added $strictMode property
January 6, 2010 ¶
- Initial release.
Never mind
It works, my mistake.
No auto create table
Hi Y!!,
Thank you for this extension. I have a problem with the setup. It doesn't auto create the table.
Interesting coding approach! :)
This extension's author has some kind of interesting approach or coding technique! :) For example, look at this particular piece of code:
private function _getConfig($db, $cache) { if (true === $this->autoCreateConfigTable) { $this->_createConfigTable($db); } if (false === $cache || false === ($this->_config = $cache->get(self::CACHE_KEY))) { $dbReader = $db->createCommand("SELECT * FROM '{$this->configTableName}`")->query(); while (false !== ($row = $dbReader->read())) { $this->_config[$row['key']] = $row['value']; } if (false !== $cache) { $cache->set(self::CACHE_KEY, $this->_config); } } }
For the first time in my PHP coding history I see notation where TRUE or FALSE is on left side of equation mark! And this way all if are constructed in this code.
But this is only a coding technique, which anyone can use as he/she prefers! :)
Code optimization?
I've also noticed that for optimization and performance reasons this part of code:
public function get($key) { $db = $this->_getDb(); $cache = $this->_getCache(); if (null === $this->_config) { $this->_getConfig($db, $cache); } ...
Should be changed into:
public function get($key) { if (null === $this->_config) { $db = $this->_getDb(); $cache = $this->_getCache(); $this->_getConfig($db, $cache); } ...
This way, calls to _getDb() and _getCache() will be executed only if $this->_config is NULL not (as in current code) with every call to get() function.
configTableName
default value for your table name
$configTableName = 'Config'
, change to
$configTableName = '{{Config}}'
it will be more flexible when using the prefix
RE: Interesting coding approach! :)
@Trejder it is unusual although I have seen it before. I believe the purpose of this style it to try to eliminate the class of bugs where an assignment is mistakenly used instead of an equal comparison. E.g.:
if($cache == false) vs. if($cache = false) // oops! accidental assignment
Personally I don't care for it. Of course in addition the boolean keywords are not really necessary with boolean variables (especially if a boolean variable naming convention is used such that variables are prefixed with "is" such as isAutoCreateConfigTable). Usually I prefer:
if($this->isAutoCreateConfigTable)
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.