代码改变世界

Yii framework 创建和使用模块(module)方法[转]

2011-11-21 10:16  冠州  阅读(732)  评论(1编辑  收藏  举报

注意:对于模块的支持从版本 1.0.3 开始。

一个模块是一个自我包含的软件单元,它由模型,视图,控制器和另外组件组成。在很多方面,一个模块类似于一个应用。主要的不同是一个模块不能单独部署,它必须位于一个应用的内部。用户可以访问一个模块中的控制器,就像访问一个普通的应用的控制器。

模块在一些情况下是有用的。对于一个大型应用,我们可以将它分离为几个模块。每个被单独的开发和维护。一些常用的特征,例如用户管理,评论管理,可以以模块的方式开发以便它们在未来的项目容易的重用。

创建模块

一个模块被组织为一个和它ID名字相同的目录。模块目录的结构类似于应用的目录。下面展示一个名为 forum 的典型目录结构:

 

 
01 forum/
02    ForumModule.php          the module class file
03    components/              containing reusable user components
04       views/                containing view files for widgets
05    controllers/             containing controller class files
06       DefaultController.php the default controller class file
07    extensions/              containing third-party extensions
08    models/                  containing model class files
09    views/                   containing controller view and layout files
10       layouts/              containing layout view files
11       default/              containing view files for DefaultController
12          index.php          the index view file
 

一个模块必须有一个扩展自 CWebModule的模块类。类的名字是表达式 ucfirst($id).’Module’, $id是模块ID(或模块目录名)。模块类是在模块代码中存储信息以及分享的核心。例如,我们可以使用 CWebModule::params来存储模块参数,使用CWebModule::components在模块级分享应用组件。

提示:我们可以使用 yiic 工具来创建一个新模块的框架。例如,要创建上面的 forum 模块,我们可以在命令行窗口中执行下面的命令:

 

 
1 % cd WebRoot/testdrive
2 % protected/yiic shell
3 Yii Interactive Tool v1.0
4 Please type ’help’ for help. Type ’exit’ to quit.
5 >> module forum

使用模块

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

 

 
1 return array(
2     ......
3     'modules'=>array('forum',...),
4     ......
5 );

一个模块也可以使用初始值来配置。其用法非常类似于配置应用组件。例如,模块 forum 在它的模块类中可以有一个属性 postPerPage,在应用配置中可以如下配置:

 

 
1 return array(
2     ......
3     ’modules’=>array(
4         ’forum’=>array(
5             ’postPerPage’=>20,
6         ),
7     ),
8     ......
9 );

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

 

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

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

提示:若一个控制器是一个控制器的子目录,我们仍然可以使用上面的路由格式。例如,假设 PostController 位于 forum/controllers/admin 目录中,我们可以指向 create 动作使用 forum/admin/post/create。

嵌套模块

模块可以嵌套,一个模块可以包含另外的模块。我们称前者为parent module(父模块)后者为child module(子模块)。子模块必须放置在父模块的 modules目录下。要访问一个子模块中的控制器动作,我们应当使用路由parentModuleID/childModuleID/controllerID/actionID。

原文 http://www.yiiframework.com/doc/guide/basics.module 翻译 http://dreamneverfall.cn/yiidoc/basics.module.htm