I've always been a fan of using INI files for storing configuration settings, but the Zend_Config_Ini class that Zend Framework comes with takes INI files to a whole new level by adding section inheritance and nested properties.
After a couple hours, I was able to take the same powerful functionality that Zend Framework provides and port it to ColdFusion, mainly for the purpose of adding it to my ColdMVC framework.
Why do I think this is cool? Let's look at a sample INI file that you might see on a project:
; Settings for the production environment
[production]
autoReload = false
development = false
reminderService.sendReminders = true
facebook.api.username = prod@mycompany.com
facebook.api.password = 90ujlc890$f
; Settings for the staging environment
[staging : production]
reminderService.sendReminders = false
facebook.api.username = staging@mycompany.com
facebook.api.password = 879kjasdf!
; Basic settings for the development environment.
; Each developer should create their own environment that extends this one.
[development : staging]
development = true
autoReload = true
; Settings for Tony's development environment
[development-tony : development]
emailService.options.forceTo = [ "tony@mycompany.com", "tony@gmail.com" ]
facebook.api.username = tony@mycompany.com
facebook.api.password = w1nn1ng
; Settings for Ryan's development environment
[development-ryan : development]
emailService.options.forceTo = ryan@mycompany.com
facebook.api.username = ryan@mycompany.com
facebook.api.password = govikes
; Settings for Joe's development environment
[development-joe : development]
emailService.options.forceTo = joe@mycompany.com
facebook.api.username = joe@mycompany.com
facebook.api.password = welcome
Pretty straightforward settings file. Each environment has its own section, but now it comes with a twist.
See the colons in the section names? That's inheritance in action. If you look at the
development-tony
environment, you'll see that it extends the development
environment, which extends the staging
environment, which extends the production
environment.Also, notice the periods in the property names. Those are nested properties, which will be automatically converted to ColdFusion structs at runtime.
So how does this work? Pretty simple:
var ini = new Ini("/path/to/config.ini");
var config = ini.getSection("development-tnelson");
If I were to now dump the
config
variable that was returned, I'd see the following output:Pretty sweet if you ask me.
You can find all of the code on GitHub at https://github.com/tonynelson19/ini/, which also includes 26 green unit tests.
Also, I've included the new INI parser in the latest version of ColdMVC, which you should definitely check out if you haven't yet.