Yii2 中关于模块(Modules)的使用及配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gu_wen_jie/article/details/86528646

什么是模块

(如果你的需求是对模块或子模块进行独立配置,请查看文末!)
在Yii2.x框架中,引入了模块(Modules)这个概念,那么什么是模块呢?

模块是独立的软件单元,由模型,视图, 控制器和其他支持组件组成, 
终端用户可以访问在应用主体中已安装的模块的控制器, 模块被当成小应用主体来看待,
和应用主体不同的是, 模块不能单独部署,必须属于某个应用主体。

上面的描述是简单理解就是你在现有的框架中又创建了一个子应用主体,但是这个子应用必须依赖于框架本身这个主应用主体,不能独立部署。
看图,表现的比较直接:
在这里插入图片描述
图中红框所示的module就是模块所在的位置,其中存在一个admin模块。(图片的logo挡住了最下面的一个非常重要的文件,Admin.php)。下面具体介绍

为什么使用模块

模块在大型项目中常备使用,这些项目的特性可分组, 每个组包含一些强相关的特性, 每个特性组可以做成一个模块由特定的开发人员和开发组来开发和维护。

在特性组上,使用模块也是重用代码的好方式, 一些常用特性,如用户管理,评论管理,可以开发成模块, 这样在相关项目中非常容易被重用。

创建及配置模块

模块被组织成一个称为 base path 的目录, 在该目录中有子目录如 controllers,models,views 分别为对应控制器,模型,视图和其他代码,和应用非常类似。 以我上图例子为例:

admin/
    Admin.php                   模块类文件
    config.php                  模块配置文件(自行手动创建)
    controllers/                 包含控制器类文件
    models/                      包含模型类文件
    views/                       包含控制器视图文件和布局文件
模块类文件

每个模块都有一个继承 yii\base\Module 的模块类, 该类文件直接放在模块的 base path 目录下, 并且能被 自动加载。当一个模块被访问, 和 应用主体实例 类似会创建该模块类唯一实例,模块实例用来帮模块内代码共享数据和组件。比如上例的Admin.php就是admin模块的模块类文件

<?php

namespace app\modules\admin;

use yii\base\Module;
/**
 * Admin module definition class
 */
class Admin extends Module
{
    /**
     * @inheritdoc
     */
    public $controllerNamespace = 'app\modules\admin\controllers';

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();
        // 从config.php 加载配置来初始化模块,------------此处待会另行说明
        \Yii::configure($this, require __DIR__ . '/config.php');
    }
}

配置

以上的文件夹及文件创建好之后,就开始就行配置了。当然你也可以使用gii来生成一个模块,请自行百度。

  • 配置主题应用:config/web.php
    注意:请在components组件配置同级添加模块配置代码:
'bootstrap' => ['log'],
'modules' => [
       'admin' => [
           'class' => 'app\modules\admin\Admin',
       ],
   ],
'components' => [
   'redis' => [
       'class' => 'yii\redis\Connection',
       'hostname' => "{$_SERVER['REDIS_HOST']}",
       'port' => 6379,
       'database' => 0,
       'password'=>"{$_SERVER['REDIS_AUTH']}"
   ],
   ...
   ...

如果你恰好添加到compoents中,你会遇到一个报错,当你运行的时候。

访问

进行完以上配置的时候其实你已经可以对该模块进行访问了,比如你在admin模块下的controllers文件夹下有一个IndexController控制器,其中一个actionIndex方法,那么你就可以这么访问:

http://yii2test.com/?r=admin/index/index

模块独立配置

这一项我认为是非常重要的一项,举个很简单的例子:
比如你的主题应用下的:config/web.php该配置文件中并没有对所有请求的的返回类型做配置,但是你的模块需要对该模块中的所有action的返回类型做一个设置,比如是:'format' => \yii\web\Response::FORMAT_JSON,也就是默认返回json,那么这个时候你就会发现不能修改web.php的情况下对子模块的配置不太容易,而且参照官方的方法配置并不生效(也许是我的方法不正确,但确实一直不生效)。按照如下做法你会解决这个问题。
以我的例子为准,在Admin.php模块类文件同级建立config.php,编辑模块类文件:
Admin.php

<?php

namespace app\modules\admin;

use yii\base\Module;
/**
 * Admin module definition class
 */
class Admin extends Module
{
    /**
     * @inheritdoc
     */
    public $controllerNamespace = 'app\modules\admin\controllers';

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();
        $config = require(__DIR__.'/config.php');
        // 获取应用程序的组件
        $components = \Yii::$app->getComponents();

        // 遍历子模块独立配置的组件部分,并继承应用程序的组件配置
        foreach( $config['components'] AS $k=>$component ){
            if( isset($component['class']) && isset($components[$k]) == false ) continue;
            $config['components'][$k] = array_merge($components[$k], $component);
        }

        // 将新的配置设置到应用程序
        // 很多都是写 Yii::configure($this, $config),但是并不适用子模块,必须写 Yii::$app
        \Yii::configure(\Yii::$app, $config);
        // custom initialization code goes here
    }
}

上面做了详细的注释,这种解决方法是参考Yii2高级版操作的。
配置文件:config.php

<?php
return $configs = [
    'components' => [
        'response' => [
            'format' => \yii\web\Response::FORMAT_JSON,
            'charset' => 'UTF-8',
        ],
    ],
];

如果你有其他的模块独立配置需求,只需要在config.php中进行配置即可,并且和应用主体的重复配置模块配置将进行覆盖操作。

展开阅读全文

没有更多推荐了,返回首页