(原创)Zend Framework 无限多模块的实现
近期要开发一个项目,app部分要根据不同功能细分为多个模块,不是传统的前端(front)与后台(admin)两个模块。而是每个模块都可以有自己的前端与后台管理。但是整体上其实也是两个部分:前端+后台。但是此项目的特殊之处就在于前端+后台分散于每个模块中。
如此,传统的多模块结构的配置不能满足要求。废话不多说了,直接上图:
modules模块结构图:

这是其中的几个模块。其中index与admin分别是前后台的入口(姑且这样认为)
application.ini配置:
resources.frontController.moduleDirectory = APPLICATION_PATH"/modules/"
resources.frontController.moduleControllerDirectoryName = "controllers"
resources.frontController.defaultModule = "index"
接下来当然是bootstrap的加载各模块了(注:并没有没有每个模块一个独立的bootstrap,而是唯一一个bootstrap),此时问题就来了,假如我有10个,或者更多的模块怎么办?传统的加载前后台两个模块:
new Zend_Application_Module_Autoloader(array(
'namespace' => 'Default',
'basePath' => $defaultModulePath
));
new Zend_Application_Module_Autoloader(array(
'namespace' => 'Back',
'basePath' => APPLICATION_PATH . '/modules/back',
));
然而现在我总不能重复的这样写吧,显然不合理。既然要实现无限多模块,就只能是只要在modules下前加一个模块,系统就会自动加载,自动识别。所以写了一个plugin解决了这个问题:
插件代码如下:
class Zend_Controller_Plugin_LoadModules extends Zend_Controller_Plugin_Abstract
{
public function getModules()
{
$ini=APPLICATION_PATH.'/configs/application.ini';
$config=new Zend_Config_Ini($ini,'production');
$path=$config->resources->frontController->moduleDirectory;
$dir=$path;
$files=array();
if(is_dir($dir))
{
if($handle=opendir($dir))
{
while(($file=readdir($handle))!==false)
{
if($file!="." && $file!="..")
{
if(is_dir($dir."/".$file))
{
$files[]=$file;
}
}
}
closedir($handle);
return $modules=$files;
}
}
}
看到这里想必你已经明白了吧,其实就是这么简单,读取modules文件夹下的文件的名称,这就是模块名,不管有多少模块,都能加载.。接下来就是bootstrap中加载了:
public function _initAutoloadModules()
{
$loadModules=new Zend_Controller_Plugin_LoadModules();
$modules=$loadModules->getModules();
foreach ($modules as $modules)
{
new Zend_Application_Module_Autoloader(array(
'namespace' => ucfirst($modules),
'basePath' => APPLICATION_PATH . '/modules/'.$modules,
));
}
}
如此,各个模块都加载完毕。是不是很巧妙,这样只要自己想要添加一个模块,直接扔进modules下就哦了,根本不用考虑加载的问题了。至于layout以及view的问题,在我的项目中无论是module名还是controller名中带有admin,就视为是后台,其他的视为前台,如此来区分,加载不同的layout与view。至于您的项目如何就自己定喽。
这样就真正地实现了无限多模块结构,不管你是2个还是20个模块都无所谓。

浙公网安备 33010602011771号