转载来源:
http://blog.csdn.net/mengxiangbaidu/article/details/7041296
http://blog.csdn.net/colzer/article/details/8443042
在YII中,程序入口是一个继承CApplication的CWebApplication的应用程序,在一个web请求的整个过程中,控制器,模型和视图都是由Application进行创建和控制。首先我们来看一下CWebApplication的类的继承结构:
从上面我们可以看到CWebApplication本身也是一个CModue。在YII中,模块之间是一个树形结构。即每一个模块都可以包含多个子模块,每一个子模块可以继续包含子模块.其中APP为树的头节点,如图:
对于一个具体请求,假设route=A/B/C/D,下面我们讲述一下,APP怎么选择相应的模块和模块中的控制器Controller和动作Action。具体的流程图如下:
一个相对来说大的项目。如果按照yii生成的webapp进行开发。所有的controller放到controllers文件夹下,所有的model放到models文件夹下面,如果你有n多个controller和n多的model,是不是就显得这种组织结构过于繁琐,冗余了。还好YII支持Modules结构。你的项目可以分成n多的Module,然后每一个Module有自己的controllers和models。这样的组织结构,无论是开发,管理都方便简洁多了。看看YII的Modules的是组织方式和使用方法。
│ ├── models │ │ ├── ContactForm.php │ │ ├── LoginForm.php │ │ └── User.php................................................................ │ ├── modules模块的存放目录 │ │ └── testmod一个模块,模块的名字对应是目录的名字,唯一。也是路由中的moduleid │ │ ├── components模块用到的组件 │ │ ├── controllers包含控制器 │ │ │ └── DefaultController.php默认控制器 │ │ ├── messages国际化 │ │ ├── models模型类文件 │ │ ├── TestmodModule.php模块的类文件 │ │ └── views试图文件 │ │ ├── default默认视图 │ │ │ ├── index.php视图文件 │ │ └── layouts包含布局文件 │ ├── runtime.................................................................... │ │ └── application.log │ ├── tests │ │ ├── bootstrap.php │ │ ├── fixtures │ │ │ └── tbl_user.php
模块的类文件:
<?php class AdminModule extends CWebModule { public $defaultController = 'default'; public $assetsUrl; //样式目录 public function init() { // this method is called when the module is being created // you may place code here to customize the module or the application // import the module-level models and components $this->setImport(array( 'application.extensions.*', 'admin.models.*', 'admin.components.*', )); //这里是用来区分前后台的session,为用户名session添加了一个admin Yii::app()->setComponents(array( 'user' => array( 'stateKeyPrefix' => 'admin', 'loginUrl'=>Yii::app()->createUrl('/admin/default/login'), ), 'errorHandler'=>array( // use 'site/error' action to display errors 'errorAction'=>'/admin/default/error', ), ) ); //设定跳转url Yii::app()->user->setReturnUrl(Yii::app()->createUrl('admin')); //发布样式资源 $this->assetsUrl = Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.modules.admin.assets')); } public function beforeControllerAction($controller, $action) { if(parent::beforeControllerAction($controller, $action)) { // this method is called before any module controller action is performed // you may place customized code here return true; } else return false; } }
config配置:
'modules'=>array( // uncomment the following to enable the Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'Enter Your Password Here', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), 'admin'=>array( 'class' => 'application.modules.admin.AdminModule' ) ),
通过gii配置:
新加模块访问地址为:http://website/index.php?r=admin