Tag Archive for 'bootstrap'
Accessing Zend Framework application resources and config options in module bootstraps
Apr 30, 2012 No Comment bootstrap php resources web zendframework
A quick post to document something I tripped over today. As usual, mostly for my own benefit since there is a decent chance that I’ll completely forget it the next time I need it.
I had a Zend Framework 1.11 app using Zend_Application
and its bootstrap process. The application had several modules. So, in application/configs/application.ini
:
resources.modules.front = "front" resources.modules.auth = "auth" resources.modules.admin = "admin"
And each module bootstrap class extended Zend_Application_Module_Bootstrap
. For example, the bootstrap class for the module named “front” looked like:
class Front_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initSomething() { // init something } }
And there were some app-level application resources – like cachemanager, for example – that were defined in the usual way:
resources.cachemanager.feed.frontend.name = Core resources.cachemanager.feed.frontend.options.lifetime = 21600 resources.cachemanager.feed.frontend.options.automatic_serialization = true resources.cachemanager.feed.backend.name = File resources.cachemanager.feed.backend.options.cache_dir = APPLICATION_PATH "/../data/cache"
All straightforward and working fine, as it has on many previous occasions.
In my module bootstraps, I was registering some front-controller plugins that needed to access those bootstrapped application resources and config data (the cachemanager resource and a feed url, respectively) that were all specified at app-level. So, I tried to access them in the module-level bootstrap using:
class Front_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initSomething() { // get some options, used later $options = $this->getOptions(); // use built-in dependency tracking $this->bootstrap('cachemanager'); // get the bootstrapped resource $cachemanager = $this->getResource('cachemanager'); // do more, with the options and the cachemanager } }
Result: The variable $options
was merely an empty array and the app would die when trying to access the cachemanager resource.
Apparently since we configured/instantiated all these at the app-level (!), I need to access them through the app-level (!) bootstrap which I can get using $this->getApplication()
. So the correct code is:
class Front_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initSomething() { // get the application-level bootstrap first $application = $this->getApplication(); // get some options, used later $options = $application->getOptions(); // use built-in dependency management $application->bootstrap('cachemanager'); // get the bootstrapped resource $cachemanager = $application->getResource('cachemanager'); // do more, with the options and the cachemanager } }
In hindsight, and with all the explicit references I have made to the adjective ‘app-level”, it’s all pretty obvious. I will note that getApplication()
does not return the Zend_Application
instance (as the name kind-of implies), but rather the app-level bootstrap. As potentially misleading as the method name may be, I suppose it makes sense since the app-level bootstrap instance is usually more directly useful than the application instance.
With any luck, I’ll remember it next time. Until then, hope this helps someone else.