模块是Yii框架中的一个十分有用的概念,这个在大项目的开发中应用地非常普遍,平时我们在使用时,可以使用模块来实现后台管理系统,这样可以做到前台和后台管理的代码的分离,方便项目的共同开发,并且有效地减少系统开发过程中的冲突。如果需要多个后台管理系统,这时我们可以采用多模块来实现,实现代码的重用,比如我们开发一个大型博客系统,有用户用户管理,有评论管理等等,我们可以通过部署两个模块来实现无关代码的分离,防止项目过于臃肿,从而影响后期的项目管理以及维护,从而增加web应用运行的稳定性。    

 

模块的概念:

    模块是一个独立的软件单元,它包含 模型, 视图, 控制器 和其他支持的组件。在许多方面上,模块看起来像一个 应用。主要的区别就是模块不能单独部署,它必须存在于一个应用里。用户可以像他们访问普通应用的控制器那样访问模块中的控制器。

创建模块

模块组织在一个目录中,目录的名字即模块的唯一 ID 。模块目录的结构跟 应用基础目录 很相似。下面列出了一个 fourm 的模块的典型的目录结构:

forum/
   ForumModule.php            模块类文件
   components/                包含可复用的用户组件
      views/                  包含小物件的视图文件
   controllers/               包含控制器类文件
      DefaultController.php   默认的控制器类文件
   extensions/                包含第三方扩展
   models/                    包含模块类文件
   views/                     包含控制器视图和布局文件
      layouts/                包含布局文件
      default/                包含 DefaultController 的视图文件
         index.php            首页视图文件

 

模块必须有一个继承自 CWebModule 的模块类。类的名字通过表达式 ucfirst($id).'Module' 确定, 其中的 $id 代表模块的 ID (或者说模块的目录名字)。模块类是存储模块代码间可共享信息的中心位置。例如,我们可以使用 CWebModule::params 存储模块参数,使用 CWebModule::components 分享模块级的 应用组件 。

使用模块

要使用模块,首先将模块目录放在 应用基础目录 的 modules 中。然后在应用的 modules 属性中声明模块 ID 。例如,为了使用上面的 forum 模块,我们可以使用如下 应用配置:

returnarray(    ......    'modules'=>array('forum',...),    ......);

模块也可以在配置时带有初始属性值。做法和配置 应用组件 很类似。例如, forum 模块可以在其模块类中有一个名为 postPerPage 的属性,它可以在 应用配置 中配置如下:

returnarray(    ......    'modules'=>array('forum'=>array('postPerPage'=>20,        ),    ),    ......);

模块的实例可通过当前活动控制器的 module 属性访问。在模块实例中,我们可以访问在模块级中共享的信息。例如,为访问上面的 postPerPage 信息,我们可使用如下表达式:

$postPerPage=Yii::app()->controller->module->postPerPage;// or the following if $this refers to the controller instance// $postPerPage=$this->module->postPerPage;

模块中的控制器动作可以通过 路由moduleID/controllerID/actionID 访问。例如,假设上面的 forum 模块有一个名为 PostController 的控制器,我们就可以通过 路由forum/post/create 访问此控制器中的 create 动作。此路由对应的 URL 即 http://www.example.com/index.php?r=forum/post/create

注意:模块的生成可以采用gii的方式,我们可以生成规范格式的module组件。