限时 5折! 详情

yii2项目实战-配置

26600 0 0

首先在阅读之前,这里有几篇入门的介绍你可以先看看。如果你已经安装过yii2,但是在了解yii2的过程中头脑略懵,也推荐你看看。

下面我们从yii2的配置说起。

yii2配置项的理解

说起项目的配置,一种简单的理解概念就是为项目做一个基本的配置,类似数据库配置、路由配置等等。但是yii2的配置往往更复杂一些,在yii2中,配置项一定是针对对象进行的配置,其作用就是对对象的初始化或者说是配置对象的默认属性。可能刚开始接触yii的会有一点不好理解,我们举个栗子进行说明:

假设我们需要为当前项目封装一个全局性的公共的方法,在yii2中怎么解决?

我们假设全局性的公共类文件位于common/components/Helper.php(components文件夹是我们自己创建的,用于以后单独存放我们自己的组件类),其内容如下:

namespace common\components;
class Helper
{
    public static function checkedMobile($mobile)
    {
        return $mobile;
    }
}

如果是在平常,我们可能会这样使用

use common\components\Helper;

Helper::checkMobile('186xxx');

但是,为了说明组件化的配置使用,我们需要在配置文件中增加一项对components的配置。你可以在你的 common\config\main.php 文件中添加如下配置

'components' => [
    // other code...
    'helper' => [
        'class' => 'common\components\Helper',
        'property' => '123',
    ],
],

你可以像下面这样使用

var_dump(Yii::$app->helper->checkedMobile('186xxx'));
var_dump(Yii::$app->helper->property);

注:在advanced版本中,对一个项目而言,默认有4个配置文件。以backend引用为例

backend\config\main-local.php
backend\config\main.php
common\config\main-local.php
common\config\main.php

如果我在多个配置文件中都配置了某一项怎么办?

从应用的入口文件 backend\web\index.php 我们了解到,最终生效的配置是经过 yii\helpers\ArrayHelper::merge 方法处理的。

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../../common/config/main.php'),
    require(__DIR__ . '/../../common/config/main-local.php'),
    require(__DIR__ . '/../config/main.php'),
    require(__DIR__ . '/../config/main-local.php')
);

也就是说这四个文件,优先级分别是 app\config\main-local.php > app\config\main.php > common\config\main-local.php > common\config\main.php,其中app代表你当前的应用,比如backend

也就是说如果我们在common\config\main.php 和app\config\main.php 文件内都配置了某一项,很显然app\config\main.php 的配置会覆盖掉 common\config\main.php 的配置。

为什么要这么设计呢?main-local又是什么鬼?

第一个问题很好理解,很显然 common下的配置可以多个应用共有,app下面的配置只针对当前应用生效。

如果你有使用git的习惯,你会发现在app\config目录下有一个隐藏的 .gitignore 文件,我们知道,这个文件内我们可以忽略某些文件,不允许提交到远程git地址。你打开后会发现,main-local.php恰好罗列其中。也就是说这个文件只会在我们本地生效。当我们把项目部署到服务器之后,这个文件并不会被提交到远程服务器,服务器会有他自己的main-local。也就是说不管是在你的测试服务器还是生产服务器,都有自己单独的main-local.php文件,只针对当前环境的配置。

我们举一个例子:你可能在生产环境配置的缓存方式是redis缓存,但是为了节省资源,你本地可能就需要配置为文件缓存了。为了达到这一目的,我们可以分别在本地的main-local.php和生产服务器的main-local.php中配置cache组件。

从上面的栗子中不难看出,其配置项的格式大多数情况下只需要指定一个class即可。当然,我们还可以为配置项(比如说我们配置的全局类)配置属性、行为和事件,鉴于理解,我们这里只对属性进行了配置,行为和事件后面我们会再说。

实战开发所需的基本配置

下面我们在做一些我们后面所需要的基本配置,但不保证是必须的。

return [
    'components' => [
        // 配置缓存
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        // 配置数据库
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=advanced',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
            'enableSchemaCache' => true,
            'schemaCacheDuration' => 24*3600,
            'schemaCache' => 'cache',
        ],
    ],
    // 配置语言
    'language'=>'zh-CN',
    // 配置时区
    'timeZone'=>'Asia/Chongqing',
];

注意language和timeZone的位置,有很多同学写在components里面了

登录 后发布评论
  • 狼哥,yii多应用配置怎么弄?

  • 想问下 yii 的 env 怎么弄, 狼哥上面讲的4个配置, 基本可以解决不同环境的配置差异, 但是貌似依然是在入口文件中, 定义当前应用的运行环境, 这在实际工作中也着实麻烦, 请问怎么解决

    • index.php是没有提交到版本库的,所以index.php内定义的debug跟laravel .env文件内定义的也就没有什么不同了。
      注:yii2没有.env配置。

    • 大神, 这个高级版本的确实默认就不提交 index.php, 但是 basic 版本的, 默认是提交 index.php 的呢, 而我们公司用的就是 basic, 每次 merge 之后都得检查 ENV, 想请教下, 对于 basic 版本, yii2 是出于何种考虑来管理 环境配置的呢? 难道是需要手动将 index.php 添加到 .gitignore 吗

  • property设置是干嘛用的??不明白。

  • 狼哥,我配置了之后报这个错:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
    是为什么连不上数据库啊?

    • 可能是mysql版本的问题,建议查一下

  • 切换为生产环境时
    修改web/index.php 注释YII_DEBUG,YII_ENV改为prod就可以了吗?

    • 如果有其他相关配置不同,也要修改,比如db

  • 本地包含-local.php,服务器不包含,服务器require就确实local.php,报错

  • 请问这是什么问题,有时候出现,有时候正常(就是没有这个错误)

    An Error occurred while handling another error:
    exception 'yii\base\InvalidConfigException' with message 'Unable to locate message source for category 'rbac-admin'.' in D:\phpStudy\WWW\homekeep\vendor\yiisoft\yii2\i18n\I18N.php:201
    Stack trace:
    #0 D:\phpStudy\WWW\homekeep\vendor\yiisoft\yii2\i18n\I18N.php(89): yii\i18n\I18N->getMessageSource('rbac-admin')
    #1 D:\phpStudy\WWW\homekeep\vendor\yiisoft\yii2\BaseYii.php(512): yii\i18n\I18N->translate('rbac-admin', '\xE5\xBE\xAE\xE4\xBF\xA1\xE7\x94\xA8\xE6\x88\xB7', Array, 'zh-CN')
    #2 D:\phpStudy\WWW\homekeep\vendor\mdmsoft\yii2-admin\components\MenuHelper.php(205): yii\BaseYii::t('rbac-admin', '\xE5\xBE\xAE\xE4\xBF\xA1\xE7\x94\xA8\xE6\x88\xB7')
    #3

    • 配置下 i18n 试试?

    • 怎么配置,或者哪里有文章可以参考

    • 参考 https://github.com/mdmsoft/yii2-admin/issues/67,此类问题可以多借助 google 查一查

  • 有个疑问,怎么知道有哪些配置项可以配,或者说去哪个类里面看如何配置

    • 配置项其实是 yii\web\Application 类属性或者部分方法的配置,可以参考 yii\web\Application 的属性去配置。这一点我们在yii源码分析中有详细介绍。

  • lik

    狼哥 为什么YII::$app->helper 就能跑到common/components这个文件夹下面

    • 参考yii2源码分析篇中我们对属性的讲解

  • 狼哥这个个人博客的模板是什么 挺好用的 方便说下吗

    • 不是模板,最初是扒的某个站,后来改了几个版本,就是现在的效果了

    • 好的 谢谢了