ThinkPHP5.0 配置

配置

框架核心配置类为位置/thinkphp/library/think/Config.php,使用时,需要指定命名空间use think\Config;

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace think;

class Config
{
    /**
     * @var array 配置参数
     */
    private static $config = [];

    /**
     * @var string 参数作用域
     */
    private static $range = '_sys_';

    /**
     * 设定配置参数的作用域
     * @access public
     * @param  string $range 作用域
     * @return void
     */
    public static function range($range)
    {
        self::$range = $range;

        if (!isset(self::$config[$range])) self::$config[$range] = [];
    }

    /**
     * 解析配置文件或内容
     * @access public
     * @param  string $config 配置文件路径或内容
     * @param  string $type   配置解析类型
     * @param  string $name   配置名(如设置即表示二级配置)
     * @param  string $range  作用域
     * @return mixed
     */
    public static function parse($config, $type = '', $name = '', $range = '')
    {
        $range = $range ?: self::$range;

        if (empty($type)) $type = pathinfo($config, PATHINFO_EXTENSION);

        $class = false !== strpos($type, '\\') ?
            $type :
            '\\think\\config\\driver\\' . ucwords($type);

        return self::set((new $class())->parse($config), $name, $range);
    }

    /**
     * 加载配置文件(PHP格式)
     * @access public
     * @param  string $file  配置文件名
     * @param  string $name  配置名(如设置即表示二级配置)
     * @param  string $range 作用域
     * @return mixed
     */
    public static function load($file, $name = '', $range = '')
    {
        $range = $range ?: self::$range;

        if (!isset(self::$config[$range])) self::$config[$range] = [];

        if (is_file($file)) {
            $name = strtolower($name);
            $type = pathinfo($file, PATHINFO_EXTENSION);

            if ('php' == $type) {
                return self::set(include $file, $name, $range);
            }

            if ('yaml' == $type && function_exists('yaml_parse_file')) {
                return self::set(yaml_parse_file($file), $name, $range);
            }

            return self::parse($file, $type, $name, $range);
        }

        return self::$config[$range];
    }

    /**
     * 检测配置是否存在
     * @access public
     * @param  string $name 配置参数名(支持二级配置 . 号分割)
     * @param  string $range  作用域
     * @return bool
     */
    public static function has($name, $range = '')
    {
        $range = $range ?: self::$range;

        if (!strpos($name, '.')) {
            return isset(self::$config[$range][strtolower($name)]);
        }

        // 二维数组设置和获取支持
        $name = explode('.', $name, 2);
        return isset(self::$config[$range][strtolower($name[0])][$name[1]]);
    }

    /**
     * 获取配置参数 为空则获取所有配置
     * @access public
     * @param  string $name 配置参数名(支持二级配置 . 号分割)
     * @param  string $range  作用域
     * @return mixed
     */
    public static function get($name = null, $range = '')
    {
        $range = $range ?: self::$range;

        // 无参数时获取所有
        if (empty($name) && isset(self::$config[$range])) {
            return self::$config[$range];
        }

        // 非二级配置时直接返回
        if (!strpos($name, '.')) {
            $name = strtolower($name);
            return isset(self::$config[$range][$name]) ? self::$config[$range][$name] : null;
        }

        // 二维数组设置和获取支持
        $name    = explode('.', $name, 2);
        $name[0] = strtolower($name[0]);

        if (!isset(self::$config[$range][$name[0]])) {
            // 动态载入额外配置
            $module = Request::instance()->module();
            $file   = CONF_PATH . ($module ? $module . DS : '') . 'extra' . DS . $name[0] . CONF_EXT;

            is_file($file) && self::load($file, $name[0]);
        }

        return isset(self::$config[$range][$name[0]][$name[1]]) ?
            self::$config[$range][$name[0]][$name[1]] :
            null;
    }

    /**
     * 设置配置参数 name 为数组则为批量设置
     * @access public
     * @param  string|array $name  配置参数名(支持二级配置 . 号分割)
     * @param  mixed        $value 配置值
     * @param  string       $range 作用域
     * @return mixed
     */
    public static function set($name, $value = null, $range = '')
    {
        $range = $range ?: self::$range;

        if (!isset(self::$config[$range])) self::$config[$range] = [];

        // 字符串则表示单个配置设置
        if (is_string($name)) {
            if (!strpos($name, '.')) {
                self::$config[$range][strtolower($name)] = $value;
            } else {
                // 二维数组
                $name = explode('.', $name, 2);
                self::$config[$range][strtolower($name[0])][$name[1]] = $value;
            }

            return $value;
        }

        // 数组则表示批量设置
        if (is_array($name)) {
            if (!empty($value)) {
                self::$config[$range][$value] = isset(self::$config[$range][$value]) ?
                    array_merge(self::$config[$range][$value], $name) :
                    $name;

                return self::$config[$range][$value];
            }

            return self::$config[$range] = array_merge(
                self::$config[$range], array_change_key_case($name)
            );
        }

        // 为空直接返回已有配置
        return self::$config[$range];
    }

    /**
     * 重置配置参数
     * @access public
     * @param  string $range 作用域
     * @return void
     */
    public static function reset($range = '')
    {
        $range = $range ?: self::$range;

        if (true === $range) {
            self::$config = [];
        } else {
            self::$config[$range] = [];
        }
    }
}

配置目录

  • 默认配置目录
    • 应用配置目录application
    • 模块配置目录application/模块目录
  • 自定义配置目录
    • 需要入口文件中添加CONF_PATH常量,指定对应配置目录
<?php

// [ 应用入口文件 ]

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 绑定当前访问到index模块
define('CONF_PATH',__DIR__.'../config/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

  • 注意:定义了自定配置目录后,所有应用配置和模块配置都应放置在自定义的文件目录中
├─application         应用目录
├─config              配置目录
│  ├─config.php       应用配置文件
│  ├─database.php     数据库配置文件
│  ├─route.php        路由配置文件
│  ├─index            index模块配置文件目录
│  │  ├─config.php    index模块配置文件
│  │  └─database.php  index模块数据库配置文件
  • 扩展配置目录

    • 应用目录中的extra目录
    • 模块目录中的extra目录

    配置方式,在扩展目录中定义需要配置的配置项作为配置文件名,配置的格式与返回数组格式,如:需要配置user_info的配置内容,则建一个user_info.php的文件,内部配置内容如下:

return [
    'user_name'=>'rufeike',
    'user_age'=>30
];

​ 读取配置,会增加对应的配置内容

["user_info"] => array(2) {
    ["user_name"] => string(7) "rufeike"
    ["user_age"] => int(30)
}

配置文件格式

默认格式

框架默认为数组格式,文件后缀为.php

//配置名称,官方推荐小写
return [
    //'配置名' => '配置值'
]
ini格式

需要在入口文件中定义define('CONF_EXT','.ini')后,在配置目录中新建config.ini文件。

username = rufeike;用户名称
userage = 30;用户年龄
json格式

需要在入口文件中定义define('CONF_EXT','.json')后,在配置目录中新建config.json文件。

{
  "user_info": {
      "username": "rufeike",
      "userage": 30
  }
}
xml格式

需要在入口文件中定义define('CONF_EXT','.xml')后,在配置目录中新建config.xml文件。

<config>
    <userinfo>
        <username>rufeike_xml</username>
        <userage>30</userage>
    </userinfo>
</config>

场景配置

在不同的环境下,使用不同的配置项。如公司和家中不同场合使用,由于数据库不一样,来回切换环境配置,可以通过配置项中的'app_status'=> 'office',来切换,以下为实现步骤

  • 修改应用或模块配置文件中的app_status,把值设置为场景名称即可,如:office
  • 在于该配置文件同级目录下,创建与场景名称同名的配置文件,如office.php
  • 执行时,将会根据指定的场景名称,自动读取对应的配置内容

其他位置配置文件加载

  • 使用配置类think\Config::load()think\Config::parse()方式加载
  • load()方式,用于加载指定路径的.php配置文件加载
use think\Config;

Config::load(__DIR__.'/../myconfig/config.php');
  • parse()方式,用于加载指定路径和文件格式的配置文件加载(不包括php后缀配置)
use think\Config;

Config::parse(__DIR__.'/../myconfig/config.ini','ini');

独立配置

  • 用户自定义的独立配置文件必须放在应用或模块下面的extra目录;
  • 默认的独立配置文件有database.php[数据库],validata.php[验证规则],如果把这两个默认独立配文件放置在extra目录中,则优先级大于放置在应用或模块目录中
  • 文件名就是配置项名称,文件返回一个数组

配置作用域

  • 作用域与命名空间的概念类似,指的是配置项的可见范围

  • 作用与的表现形式上与二维数组一样

  • 切换作用域使用:think\Config::range('作用域'),系统默认的作用域为_sys_

    示例:在show作用域中设定配置,和切换到show作用域中,打印对应的配置内容

<?php
namespace app\index\controller;
use \think\Controller;
use \think\Config;

class Index extends Controller{
    public function index(){
        $config = array(
            'xiao'=>'rufeike',
            'age'=>10,
            'height'=>172
        );
        Config::set('xiao',$config,'show');
        Config::range('show');
        dump(config());
    }

}

输出结果

array(1) {
  ["xiao"] => array(3) {
    ["xiao"] => string(7) "rufeike"
    ["age"] => int(10)
    ["height"] => int(172)
  }
}

动态配置

  • 使用配置类进行设置,think\Config::set()
    • 单个配置:think\Config::set('配置项','参数值')
    • 批量配置:think\Config::set(数组)
    • 二级配置:think\Config::set('配置项',数组)
  • 使用助手函数设置,config()
    • 单个配置:config('配置项','参数值')
    • 批量配置:config(数组)
    • 二级配置:config('配置项',数组)

读取配置项

  • 类方法:think\Config::get('配置项'),参数为空则读取全部配置项
  • 助手函数config('配置项'),参数为空则读取所有配置项
  • 读取二级配置项,参数与值之间使用.进行连接:如:config('database.hostname')

判断配置项是否存在

  • 类方法:think\Config::has('配置项'),返回布尔值;
  • 助手函数:config('?配置项'),返回布尔值;

配置项优先级

惯例配置->应用配置->扩展配置->场景配置->模块配置->动态配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值