目录

  • 类重写

  • 视图重写

  • 重写模块

  • 重写component

  • 重写控制器

类重写(任意重写)

原先重写某个Yii的类方法

譬如:yii\helpers\ArrayHelper

我需要新建一个类,继承,然后覆盖这个类的方法。
如果我的系统都成型了,然后我在调用这个类的地方,需要将

use yii\helpers\ArrayHelper

改成

use xxxxxx\helpers\ArrayHelper

这样子很不方便,又容易遗忘掉那些地方调用该类

万能重写(classMap)

通过配置文件的方式进行替换,这样比较方便。

注意:

  • namespace和上面的那个ArrayHelper类的要一样,而不是按照替换类的命名空间比如 common/helpers/ArrayHelper.php 写成 namespace common\helpers,这样会报错的。

  • 新的类的名字必须和之前的类的名字一样,否则会出错。

common/config/YiiClassMap.php 下面添加一条数组,内容如下:

<?php
    return [
      'yii\helpers\ArrayHelper' => 'common/helpers/ArrayHelper.php',   
    ];

这样子,我们已经可以,在不修改yii2代码和系统文件的前提下,修改任意功能了。

视图(theme)重写

根据yii2的模板路径优先级加载而来

如果想替换系统原先的视图文件改写为自己的视图文件可直接在backend\modules\sys\views\下创建对应的视图文件进行替换

详细代码参考backend\config\main.php

        /** ------ 视图替换 ------ **/
        'view' => [
            'theme' => [
                'pathMap' => [
                    // 表示@backend/views优先于@basics/backend/views
                    '@basics/backend/views' => '@backend/views',
                    '@basics/backend/modules/sys/views' => '@backend/modules/sys/views',
                    '@basics/backend/modules/wechat/views' => '@backend/modules/wechat/views'
                ],
            ],
        ],

重写模块

Yii2的知识,可直接在main.php里面把class指向替换成为自己的模块路径

    'modules' => [
        /* 系统模块 */
        'sys' => [
            'class' => 'jianyan\basics\backend\modules\sys\Module',
        ],
    ],

重写component

Yii2的知识,同理,添加配置覆盖class就可以了

重写控制器

Yii2的知识,main.php 的 components 同级下添加 controllerMap把class指向替换成为自己的控制器路径

    'controllerMap' => [
        // 文件上传公共控制器
        'file' => [
            'class' => 'jianyan\basics\common\controllers\FileBaseController',
        ]
    ],

类重写官网介绍:http://www.yiiframework.com/doc-2.0/guide-helper-overview.html#customizing-helper-classes
对于Yii2的自动加载的原理,可以参看:http://www.digpage.com/autoload.html
类重写介绍来源:Terry博客


上次更新:2018-04-18