一个相对来说大的项目。如果按照yii生成的webapp进行开发。所有的controller放到controllers文件夹下,所有的model放到models文件夹下面,如果你有n多个controller和n多的model,是不是就显得这种组织结构过于繁琐,冗余了。还好YII支持Modules结构。你的项目可以分成n多的Module,然后每一个Module有自己的controllers和models,其实这种结构叫做HMVC。这样的组织结构,无论是开发,管理都方便简洁多了。看看YII的Modules的是组织方式和使用方法。module是对相同业务逻辑的app中的内容模块化,比如博客前台系统可以模块化成blog,博客后台系统可以模块化成admin,模块化便于对应用的管理扩展。
我们可以手动创建一个modules,也可以使用yiic命令行来创建。建议还是 用手工来创建吧,这样子自己对整个目录结构都更加清晰和了解了。建好的目录结构如下:
│ ├── models
│ │ ├── ContactForm.php
│ │ ├── LoginForm.php
│ │ └── User.php................................................................
│ ├── modules模块的存放目录
│ │ └── timeline一个模块,模块的名字对应是目录的名字,唯一。也是路由中的moduleid
│ │ ├── components模块用到的组件
│ │ ├── controllers包含控制器
│ │ │ └── DefaultController.php默认控制器
│ │ ├── messages国际化
│ │ ├── models模型类文件
│ │ ├── TimelineModule.php模块的类文件
│ │ └── views试图文件
│ │ ├── default默认视图
│ │ │ ├── index.php视图文件
│ │ └── layouts包含布局文件
| | │ ├── main.php布局文件
│ ├── runtime....................................................................
│ │ └── application.log
│ ├── tests
│ │ ├── bootstrap.php
│ │ ├── fixtures
│ │ │ └── tbl_user.php
上面我建立了一个名字叫timeline的模块。
要使用模块功能,我们需要在模块里面创建一个模块的类文件,即上面的TimelineModule.php这个文件里面的内容如下:
class TimelineModule extends CWebModule
{
// 这个方法是在此模块被创建的时候调用的,我们可以在这里做一些自定义的事情
public function init()
{
// 导入模块下面的模型文件和组件文件
$this->setImport(array(
'timeline.models.*',
'timeline.components.*',
));
}
//这个方法实在所有模块控制器被执行之前调用的。
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action))
{
return true;
}else{
return false;
}
}
}
模块必须继承CWebModule(->CModule->CComponent)。类名是模块名首字母大写,后缀是Module。
init()
初始化模块,通过代码可以看到,可以用来导入其他模块的组件。主要完成模块的初始工作
beforeControllerAction()
afterControllerAction()
用于在模块内的Controller,Action执行之前和执行之后进行相关的操作
模块的配置,使用方法
(1).配置文件/yii/webapp/protected/config/main.php
‘modules’=>array(‘timeline’,),
配置文件中也可以及添加对模块中属性初始化的参数例如:
‘modules’=>array(‘timeline’=>array(‘param’=>’param1′),
对应的访问方式是:
Yii::app()->controller->module->param;
(2).要想禁用一个模块,很简单:
‘modules’=>array(‘timeline’=>array(‘enabled’=>’false’),即可。
(3).YII中的模块是非常灵活的,一个模块可以包含子模块。理论上,模块可以是无限嵌套。
模块中的控制器:
模块中的控制器和外边的控制器一样,都是需要继承CController的,其他的和外边一样,
布局:
模块中过的布局可以使用自己模块中的布局文件来进行,
模块的布局文件存放在modules/modulesName/views/layouts/xxx.php,
要使用某个布局文件只要是控制器中定义$layout的值就可以了。
class DefaultController extends Controller{
public $layout = 'test';//使用布局
public function actionIndex(){
$this->render('test');
}
}
他的视图文件同样的是存放在modules/modulesName/views/ControllerName/xxx.php中。
访问该模块控制器的方式:
1:http://xxx.xxx.com/webapp/timeline/default/index
2:http://xxx.xxx.com/webapp/index.php?r=/timeline/default/index