In my Zend Framework application I wanted a bootstrap class for every module. Each bootstrap class will instantiate confirguration specific for each module. You do not have to add a bootstrap class to a module if no confirguration is required for that module.
I first looked at Zend_Application_Resource_Modules, but it loads all the bootstrap files for each module in my application. This is not what I wanted to achive.
Here is my attempt to achieve my goal
Create a controller plugin. I called it Moo_Controller_Plugin_Init
/**
*
* @copyright 2009 Mohammed Alsharaf
* @author Mohamed Alsharaf
* @category Moo
* @package Moo_Controller
* @copyright Copyright (c) 2009-2010 Mohammed Alsharaf.
* @license http://framework.zend.com/license/new-bsd
* @version Release: 0.0.2
* @link http://jamandcheese-on-phptoast.com/
*/
class Moo_Controller_Plugin_Init extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(
Zend_Controller_Request_Abstract $request)
{
// include bootstrap if it's exists
$bootstrap = APPLICATION_PATH . 'modules/' . $module . '/Bootstrap.php';
if(!file_exists($bootstrap)) {
return false;
}
require_once $bootstrap;
// format module name
$module = $this->_formatModuleName($module);
// instantiate bootstrap and pass any object/data you want
$class = $module . '_Bootstrap';
$moduleBootstrap = new $class();
$moduleBootstrap->setRequest($this->getRequest())
->setResponse($this->getResponse())
->init();
}
protected function _formateModuleName($module)
{
if(strpos($module, '-') !== false) {
$filter = new Zend_Filter_Word_DashToCamelCase();
$module = $filter->filter($module);
} elseif(strpos($module, '_') !== false) {
$filter = new Zend_Filter_Word_UnderscoreToCamelCase();
$module = $filter->filter($module);
} else {
$module = ucfirst($module);
}
return $module;
}
}
Register the controller plugin in front controller. This will depend on how you have the configuration setup. You can either add the plugin from the application.ini file by adding
resources.frontController.plugins.init = "Moo_Controller_Plugin_Init"
Or by calling the method “registerPlugin” in Zend_Controller_Front.
$front = Zend_Controller_Front::getInstance(); $front->registerPlugin(new Moo_Controller_Plugin_Init, 1);
Each module bootstrap class will extend an abstract class for common methods.
/**
*
* @copyright 2009 Mohammed Alsharaf
* @author Mohamed Alsharaf
* @category Moo
* @package Moo_Application
* @copyright Copyright (c) 2009-2010 Mohammed Alsharaf.
* @license http://framework.zend.com/license/new-bsd
* @version Release: 0.0.1
* @link http://jamandcheese-on-phptoast.com/
*/
abstract class Moo_Application_Module_BootstrapAbstract
{
/**
* @var Zend_Controller_Request_Abstract
*/
protected $_request;
/**
* @var Zend_Controller_Response_Abstract
*/
protected $_response;
/**
* Set request object
*
* @param Zend_Controller_Request_Abstract $request
* @return Moo_Application_Module_BootstrapAbstract
*/
public function setRequest(Zend_Controller_Request_Abstract $request)
{
$this->_request = $request;
return $this;
}
/**
* Get request object
*
* @return Zend_Controller_Request_Abstract $request
*/
public function getRequest()
{
return $this->_request;
}
/**
* Set response object
*
* @param Zend_Controller_Response_Abstract $response
* @return Moo_Application_Module_BootstrapAbstract
*/
public function setResponse(Zend_Controller_Response_Abstract $response)
{
$this->_response = $response;
return $this;
}
/**
* Get response object
*
* @return Zend_Controller_Response_Abstract $response
*/
public function getResponse()
{
return $this->_response;
}
}
The bootstrap class looks like
/**
*
* @copyright 2009 Mohammed Alsharaf
* @author Mohamed Alsharaf
* @copyright Copyright (c) 2009-2010 Mohammed Alsharaf.
* @license http://framework.zend.com/license/new-bsd
* @version Release: 0.0.1
* @link http://jamandcheese-on-phptoast.com/
*/
class Admin_Bootstrap extends Moo_Application_Module_BootstrapAbstract
{
public function init()
{
// add your code here.
}
}
Any comments appreciated

You does not show your class “Moo_Options” and two line after you write :
require_once $coreBootstrap; and i think it is
$bootstrap
Thanks Cyril
I have fixed the code.