YII Framework学习教程-YII的Modules(模块化)

  一个相对来说大的项目。如果按照yii生成的webapp进行开发。所有的controller放到controllers文件夹下,所有的model放到models文件夹下面,如果你有n多个controller和n多的model,是不是就显得这种组织结构过于繁琐,冗余了。还好YII支持Modules结构。你的项目可以分成n多的Module,然后每一个Module有自己的controllers和models。这样的组织结构,无论是开发,管理都方便简洁多了。看看YII的Modules的是组织方式和使用方法。

           1.用yiic创建module

          在 《

YII Framework学习教程-用YIIC快速创建YII应用之三-2011-11-11

 》,已经讲了如何用yiic给制定的应用创建一个模块。

          在shell模式下,输入 module 模块名称 。

    2.module的目录结构

     

[php]  view plain copy
  1. │   ├── models  
  2. │   │   ├── ContactForm.php  
  3. │   │   ├── LoginForm.php  
  4. │   │   └── User.php................................................................  
  5. │   ├── modules模块的存放目录  
  6. │   │   └── testmod一个模块,模块的名字对应是目录的名字,唯一。也是路由中的moduleid  
  7. │   │       ├── components模块用到的组件  
  8. │   │       ├── controllers包含控制器  
  9. │   │       │   └── DefaultController.php默认控制器  
  10. │   │       ├── messages国际化  
  11. │   │       ├── models模型类文件  
  12. │   │       ├── TestmodModule.php模块的类文件  
  13. │   │       └── views试图文件  
  14. │   │           ├── default默认视图  
  15. │   │           │   ├── index.php视图文件  
  16. │   │           └── layouts包含布局文件  
  17. │   ├── runtime....................................................................  
  18. │   │   └── application.log  
  19. │   ├── tests  
  20. │   │   ├── bootstrap.php  
  21. │   │   ├── fixtures  
  22. │   │   │   └── tbl_user.php  
             

    基本的目录结构如上,当然你可以在自己加入一些自定义的东西。

     

    3.模块的类文件(例如:TestmodModule.php)

[php]  view plain copy
  1. <?php  
  2.   
  3. class TestmodModule extends CWebModule  
  4. {  
  5.     public function init()  
  6.     {  
  7.         // this method is called when the module is being created  
  8.         // you may place code here to customize the module or the application  
  9.   
  10.         // import the module-level models and components  
  11.         $this->setImport(array(  
  12.             'testmod.models.*',  
  13.             'testmod.components.*',  
  14.         ));  
  15.     }  
  16.   
  17.     public function beforeControllerAction($controller$action)  
  18.     {  
  19.         if(parent::beforeControllerAction($controller$action))  
  20.         {  
  21.             // this method is called before any module controller action is performed  
  22.             // you may place customized code here  
  23.             return true;  
  24.         }  
  25.         else  
  26.             return false;  
  27.     }  
  28. }  

   模块必须继承CWebModule(->CModule->CComponent)。类名是模块名首字母大写,后缀是Module。

   init()

   初始化模块,通过代码可以看到,可以用来导入其他模块的组件。主要完成模块的初始工作

   beforeControllerAction()

   afterControllerAction()

   用于在模块内的Controller,Action执行之前和执行之后进行相关的操作


   4.模块的配置,使用方法

    (1).配置文件/yii_dev/testwebap/protected/config/main.php

        'modules'=>array('testmod',),

        配置文件中也可以及添加对模块中属性初始化的参数例如:

        'modules'=>array('testmod'=>array('param'=>'param1'), 

   

[php]  view plain copy
  1. <?php  
  2.   
  3. class TestmodModule extends CWebModule  
  4. {  
  5.     public $param;  
  6.       

     

        对应的访问方式是:

        Yii::app()->controller->module->param;        

     (2).YII中的模块是非常灵活的,一个模块可以包含子模块。理论上,模块可以是无限嵌套。


  5.模块的路由

     在yii的路由章节已经说明了模块的路由格式。这里不再累述


————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

配置使用这个模块

我们对主配置文件 : protected/config/main.php进行配置,如下的代码需要被修改,添加了'admin', :

复制代码
'modules'=>array( 
    'gii'=>array(
        'class'=>'system.gii.GiiModule', 
        'password'=>'你的密码',
    ),
    'admin',
),
复制代码

  保存上面的修改后后,我们的新admin模块已经可以使用了。我们可以先通过以下地址访问一下index.php?r=admin/default/index

在模块中使用layout

我们访问index.php?r=admin/default/index会发现,模块使用了你的应用下的/protected/views/layouts/main.php文件,而我们可能希望使用/protected/modules/admin/views/layouts/main.php文件,让admin模块拥有独立的布局视图。

我们在protected\modules\admin\controllers\DefaultController.php添加如下代码,

?
public  $layout = 'application.modules.admin.views.layouts.main' ;

  我们把从/protected/views/layouts/main.php 拷贝到/protected/modules/admin/views/layouts/,稍作修改,这样模块就拥有了独立的布局视图.

 在模块中使用Assets

添加新的模块时,一般会包含图像文件,CSS文件,JavaScript文件等。

模块可以直接从网站主目录中引用。但是如果想要创建一个模块能够在任何地方引用,并且能够避免命名冲突,就要用到assets了。

过程是(这里模块名是admin):

1、把需要用到的资源放在modules/admin/assets下。

2、然后通过 CAssetManager,Yii::app()->assetManager能够自动的将私有资源publish到公共目录下 网站目录/assets

3、Yii会自动在网站目录的/assets下创建一个随机不冲突的文件夹,如2b31b42b,并把你的modules/admin/assets目录下的文件拷贝过去。

例如我的模块是Admin,文件路径通过如下代码获得,修改protected\modules\admin\AdminModule.php文件,

复制代码
class AdminModule extends CWebModule
{

/*开始*/
 private$_assetsUrl;

publicfunction getAssetsUrl()
 {
  if($this->_assetsUrl===null)
   $this->_assetsUrl=Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.modules.admin.assets'));
  return$this->_assetsUrl;
 }

 publicfunction setAssetsUrl($value)
 {
  $this->_assetsUrl=$value;
 }

/*结束*/

}
复制代码

然后,在/protected/modules/admin/views/layouts/main.php中

使用$this->module->assetsUrl就可以调用你的css等文件了。

代码如下,

?
< link  rel = "stylesheet"  type = "text/css"  href="<?php echo $this->module->assetsUrl; ?>/css/screen.css" media="screen, projection" />

  4,通过如上操作,该模块只要把admin目录拷贝,就可以多次复用了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值