刘家三少爷

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

(原创)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个模块都无所谓。

posted on 2013-07-07 15:45  刘家三少爷  阅读(154)  评论(0)    收藏  举报