I recently came up a very steep learning curve using the Zend Framework (version 1.11.3). I had used components of ZF in the past with success, but this was the first time I had used Zend_Application
for my core MVC. I am no stranger to MVC frameworks in general, but I struggled with Zend.
My biggest source of confusion was the bootstrap process. Namely, the autoloading of resources. Yes, I followed the Zend Framework Quick Start and got my app up and running. Unfortunately, I didn’t actually know what was happening. Finally, I came across this great question on Stackoverflow about bootstrapping the layout resource that pointed me in the right direction:
The line from
application.ini
resources.layout[] =
is equivalent to:
_initLayout() {}
in
Bootstrap.php
Aha! So now it was clear. There are two ways to initialize a resource in Zend:
Bootstrap.php
. Option #1 bothers me. Yes, it’s really cool that you can bootstrap a whole MVC application with no code and only a config file, but IMO that option should not be the recommended way for beginners and that options should most definitely not be used in any sort of “Quick Start” guide. That sort of magic should be reserved for advanced users. With a little more exploring, I found the code that initialized these resources in the non-trivial Zend_Application_Bootstrap_BootstrapAbstract
class. And I found all the built-in Zend resources in Zend/Application/Resource
, which let me see which resources had which options and how to bootstrap them.
On to option #2, my preferred way. If I want to initialize the Front Controller, I’ll just put this in the bootstrap file:
protected function _initFrontController()
{
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(APPLICATION_PATH . '/controllers');
return $front;
}
If I want to enable and initialize the layout:
protected function _initLayout()
{
$layout = Zend_Layout::startMvc();
$layout->setLayoutPath(APPLICATION_PATH . '/layouts/scripts/');
return $layout;
}
I really don’t mind carrying this around to every project. Then I can make changes in the PHP, and not in an INI file.
Clearly I am not the only one struggling with this. I googled problems heavily and the top results usually contained 3 or 4 of the same question asked on Stackoverflow, each of which I opened in a tab. I think Zend would benefit with a re-organization of the documentation from the ground up, at least of the starter docs and Zend_Application
. They should also post a big, flashing red link to that Stackoverflow question about bootstrapping layout.
Eventually, other components became clear: Resources, Plugins, Action Helpers, and View Helpers, Modules. I see real power in using the Zend Framework now, particularly with Plugins and Modules, but only after much pain.
I have created a starter project for Zend projects that contains Bootstrap.php
the way I like it, and some other custom classes for logging and error handling. There is a branch for a starter project with modules and without modules. (Modules is a different blog post altogether.)
I don’t know if it’s true, but I thought I read somewhere that opening and closing the refrigerator wastes energy. Maybe that’s why, the other day when we were unloading groceries, I caught myself trying to minimize this waste.
Here is the layout of our kitchen. We usually bring in all the groceries from the car and put them down in the Grocery Unloading Area. From here, we grab a handful of items put them away. If some go in the fridge, we open the fridge and put them away.
If opening and closing a refrigerator incurs an overhead, just like opening and closing a network or database connection incurs an overhead, this is very inefficient. So I found myself bringing refrigerated items near the fridge, in a Refrigerator Staging Area, or refrigerated items buffer, if you will. This way, I could quickly put away all fridge items, flushing the buffer, and only open the refrigerator once, saving the setup and teardown refrigerator opening costs.
Too much of a stretch? I deal with this kind of crap all day long, so maybe this was inevitable.