本课共分10个模块,从配置文件格式(php/ini/json/xml)到场景配置,模块配置,扩展配置,独立配置,动态配置,自定义配置加载,环境变量变量,全景展现一个多彩的ThinkPHP5配置世界~~。

请将图打开到新网页查看,效果更好。或者下载到本地查看。本图由xmind思维导图制作,底部有xmind源文件下载,用xmind软件打开效果更棒。

一、思维导图:

ThinkPHP5框架配置.png

二、文件描述:

ThinkPHP5框架配置

1 配置目录

1.1 默认配置目录

1.1.1 应用配置:application目录

1.1.2 模块配置: application/模块目录

1.2 自定义配置目录

1.2.1 入口文件中:define('CONF_PATH', __DIR__.'/../config/');

1.2.2 定义用户自定义配置文件目录和应用目录同级

1.2.3 应用配置文件包括三个:config.php/database.php/route.php

1.2.4 模块配置文件包括三个:config.php/database.php

1.2.5 路由在应用初始化时已生成,所以不要在模块中配置route.php

1.3 扩展配置目录

1.3.1 在应用或模块配置目录下创建extra目录

1.3.2 在extra目录下创建的配置文件名,就是扩展配置名称,所以扩展配置都是二维数组

1.在extra目录创建:myconf.php

2.在myconf.php文件中:

1

2

3

4

return [

  'site_name'=>'www.php.cn',

];

3. 在控制器中访问:

1

dump(\think\Config::get());

可以在最后面看到:

1

2

3

["myconf"] => array(1) {

    ["site_name"] => string(10) "www.php.cn"

  }

1.3.3 最终创建的扩展配置项,都会与应用配置项合并(dump(\think\Config::get());//查看)

2 配置格式

2.1 Array格式

2.1.1 这是默认格式,不用在入口文件中配置CONF_EXT常

2.1.2 配置文件:config.php,内容是用return 返回的数组

1

2

3

4

return [

'my_name' => '朱老师',

];

2.1.3 支持二配置,以二维数组表示

1

2

3

4

5

6

7

8

return [

'my_info' => [

      'my_name' => '朱老师',

      'my_age' => 28,

      'my_sex' => '男',

  ],

];

2.1.4 返回内容自动与应用配置合并,以数组方式返回

1

2

3

4

5

["my_info"] => array(3) {

    ["my_name"] => string(9) "朱老师"

    ["my_age"] => int(28)

    ["my_sex"] => string(3) "男"

  }

2.2 ini格式

2.2.1 在入口文件中更改配置格式: define('CONF_EXT', '.ini');

1

2

3

4

5

6

7

8

9

// 定义应用目录

define('APP_PATH', __DIR__ . '/../application/');

//定义配置目录

define('CONF_PATH', __DIR__ . '/../config/');

// 更改配置格式为ini格式

define('CONF_EXT', '.ini');

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

2.2.2 配置文件:config.ini,内容是由等号连接的名值对组成, 注释写在分号;后面

名称用匈牙利命名法,名值之间用等号连接,值不用定界符号

1

2

3

4

config.ini

内容:

my_name=朱老师 ;我的姓名

;my_name是配置名称,朱老师是值,分号后面是该配置项的注释部分,可以省略

2.2.3 支持二级配置,配置项放在一对方括号中

config.ini中的二级配置内容

1

2

3

4

[base_info]

my_name=朱老师;我的姓名

my_age=28 ;我的年龄

my_sex=男 ;我的性别

2.2.4 返回内容自动与应用配置合并,以数组方式返回

应用配置中返回结果是二维数组:

1

2

3

4

5

["base_info"] => array(3) {

    ["my_name"] => string(9) "朱老师"

    ["my_age"] => string(2) "28"

    ["my_sex"] => string(3) "男"

  }

2.3 xml格式

2.3.1 在入口文件中更改配置格式: define('CONF_EXT', '.xml');

1

2

3

4

5

6

7

8

9

// 定义应用目录

define('APP_PATH', __DIR__ . '/../application/');

//定义配置目录

define('CONF_PATH', __DIR__ . '/../config/');

// 更改配置格式为ini格式

define('CONF_EXT', '.xml');

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

2.3.2 配置文件:config.xml,配置项放在一对标签中,标签名就是配置项

1

2

3

4

5

6

7

8

9

10

<config>

   <my_home>安徽省合肥市my_home>

config>



<abc>

   <my_home>安徽省合肥市my_home>

abc>

2.3.3 支持二级配置,配置项放在一对标签中

1

2

3

4

5

6

<abc>

<info>

   <my_home>安徽省合肥市my_home>

   <my_work>中文网my_work>

info>

abc>

2.3.4 返回内容自动与应用配置合并,以数组方式返回

应用配置中返回结果是二维数组:

1

2

3

4

["info"] => array(2) {

    ["my_home"] => string(18) "安徽省合肥市"

    ["my_work"] => string(9) "中文网"

  }

2.4 json格式

2.4.1 在入口文件中更改配置格式: define('CONF_EXT', '.json');

1

2

3

4

5

6

7

8

9

// 定义应用目录

define('APP_PATH', __DIR__ . '/../application/');

//定义配置目录

define('CONF_PATH', __DIR__ . '/../config/');

// 更改配置格式为ini格式

define('CONF_EXT', '.xml');

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

2.4.2 配置文件:config.json,配置项放在json对象中,配置项的名值对用javascript对象表示

1

2

3

4

5

{

  "my_name":"朱老师",

  "my_age":28,

  "my_sex":"男"

}

特别注意:最后一个配置项后面,千万不要加逗号

2.4.3 支持二级配置,配置项放在一对标签中

1

2

3

4

5

6

7

{

  "base_info":{

    "my_name":"朱老师",

    "my_age":28,

    "my_sex":"男"

  }

}

很简单,在所有配置上的上一级再加一层,再把当前数据嵌套进去就可以了。

2.4.4 返回内容自动与应用配置合并,以数组方式返回

1

2

3

4

5

["base_info"] => array(3) {

    ["my_name"] => string(9) "朱老师"

    ["my_age"] => int(28)

    ["my_sex"] => string(3) "男"

  }

3 场景配置

3.1 用途:在不同的环境下,使用不同的配置项

3.2 修改应用配置config.php中'app_status'=>'场景名称',

这个场景名称,对应着应用配置目录下面一个配置文件,该配置文件内容默认是数组方式。

例如,你可能在家中工作,使用的数据库连接参数与办公室是不一样的。

那么你可以先将:

'app_status'=>'home',设置为home家中

同样,如果你到了公司,要换成公司的数据库,可以在应用配置文件中:

1

2

3

4

5

return [

// 应用模式状态,将home改成office

'app_status'  => 'office',

];

3.3 在应用配置目录下创建与场景名称同名的php文件做为配置文件,以数组方式返回配置项

然后在当前应用配置目录下面创建一个:home.php文件

里面写上如下内容:

实际上就是database.php中的内容复制一份就行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

return [

    // 数据库类型

    'type'            => 'mysql',

    // 服务器地址

    'hostname'        => 'localhost',

    // 数据库名

    'database'        => 'home',

    // 用户名

    'username'        => 'root_home',

    // 密码

    'password'        => 'root_home',

    // 端口

    'hostport'        => '',

     // 连接dsn

    'dsn'             => '',

    // 数据库连接参数

    'params'          => [],

    // 数据库编码默认采用utf8

    'charset'         => 'utf8',

    // 数据库表前缀

    'prefix'          => '',

    // 数据库调试模式

    'debug'           => true,

    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)

    'deploy'          => 0,

    // 数据库读写是否分离 主从式有效

    'rw_separate'     => false,

    // 读写分离后 主服务器数量

    'master_num'      => 1,

    // 指定从服务器序号

    'slave_no'        => '',

    // 是否严格检查字段是否存在

    'fields_strict'   => true,

    // 数据集返回类型

    'resultset_type'  => 'array',

    // 自动写入时间戳字段

    'auto_timestamp'  => false,

    // 时间字段取出后的默认时间格式

    'datetime_format' => 'Y-m-d H:i:s',

    // 是否需要进行SQL性能分析

    'sql_explain'     => false,

     // Builder类

    'builder'         => '',

    // Query类

    'query'           => '\\think\\db\\Query',

];

同样,如果你到了公司,要换成公司的数据库,

然后在应用配置目录下创建office.php文件,将数据库配置信息写入,以数据形式返回,就可以了。

4 模块配置

4.1 模块也可以有自己的独立配置:模块名/config.php

4.2 模块配置优先于应用配置,相同配置会覆盖应用配置

4.3 模块也支持场景状态配置,原理与步骤与应用一致

1.创建模块配置文件: application/index/config.php

2. 添加配置项,修改应用状态

1

2

3

4

5

return [

// 模块模式状态

'app_status'  => 'module_office',

];

3.在index模块目录下创建: modult_office.php,做为模块的场景状态配置文件

文件内容也以数据库连接为例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

return [

    // 数据库类型

    'type'            => 'mysql',

    // 服务器地址

    'hostname'        => 'localhost',

    // 数据库名

    'database'        => 'modult_office',

    // 用户名

    'username'        => 'modult_office',

    // 密码

    'password'        => 'modult_office',

    // 端口

    'hostport'        => '',

    // 连接dsn

    'dsn'             => '',

    // 数据库连接参数

    'params'          => [],

    // 数据库编码默认采用utf8

    'charset'         => 'utf8',

    // 数据库表前缀

    'prefix'          => '',

    // 数据库调试模式

    'debug'           => true,

    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)

    'deploy'          => 0,

    // 数据库读写是否分离 主从式有效

    'rw_separate'     => false,

    // 读写分离后 主服务器数量

    'master_num'      => 1,

    // 指定从服务器序号

    'slave_no'        => '',

    // 是否严格检查字段是否存在

    'fields_strict'   => true,

    // 数据集返回类型

    'resultset_type'  => 'array',

    // 自动写入时间戳字段

    'auto_timestamp'  => false,

    // 时间字段取出后的默认时间格式

    'datetime_format' => 'Y-m-d H:i:s',

    // 是否需要进行SQL性能分析

       'sql_explain'     => false,

    // Builder类

    'builder'         => '',

    // Query类

    'query'           => '\\think\\db\\Query',

];

4. 保存后,打开浏览器查看,可以看到配置更新结果

5 其它位置的配置文件

5.1 全部在控制器的方法中动态调用Config类中的方法完成手工加载

5.2 用Config::load(配置文件):可以加载任何位置的配置文件,默认Array格式

先在与config目录中创建同级的newconf目录,在该目录下创建conf.php,如果是.php文件,就默认是以数组方式返回配置项,采用Config::load()方法手工动态加载

config/newconf/conf.php文件内容

1

2

3

4

return [

  'user_define' =>'www.php.cn'

];

控制器中的:index/index/中的index方法

1

2

3

4

5

6

7

8

9

10

11

namespace app\index\controller;

class Index

{

    public function index()

    {

//手工加载指定目录下的配置文件,注意Config类的命名空间

    \think\Config::load(APP_PATH.'../config/newconf/conf.php');

    dump(\think\Config::get());

    }

}

5.3 如果是其它格式(ini/xml/json)用Config::parse(文件,'类型')来加载

先在与config目录中创建同级的newconf目录,在该目录下创建conf.ini,按框架的约定,不论是什么格式的配置文件,最终必须是以数组方式返回配置项,所以第一步就是要将其它格式的数组,解析成数组,所以就不能再用Config::load()方法了,Config类提供了一个Config::parse()方法来加载其它格式的配置文件,这个方法有二个参数,第一个是要加载的配置文件,第二个就是当前配置文件的格式,如ini,xml或json等

我们以ini格式为例

config/newconf/conf.ini文件内容

1

2

my_system = mac_os

my_phone = huawei

控制器中的:index/index/中的index方法

1

2

3

4

5

6

7

8

9

10

11

namespace app\index\controller;

class Index

{

    public function index()

    {

//手工加载指定目录下的配置文件,注意Config类的命名空间

   \think\Config::parse(APP_PATH.'../config/newconf/conf.ini','ini');

    dump(\think\Config::get());

    }

}

5.4 最终与前面一样,都是与应用配置合并后以数组方式返回全部配置项

1

2

["my_system"] => string(6) "mac_os"

  ["my_phone"] => string(6) "huawei"

6 读取配置项

6.1 方法1:Config::get('参数'),不传入参数则是读取应用的全部配置项

6.2 方法二:作用助手函数config(),不需要导入命名空间直接使用,效率低不推荐

6.3 Config::get('my_info.my_system')方法可以读取二级配置,配置项之间用.点连接

6.4 Config::has(''app_status''):has方法检测某个配置项是否存在,返回布尔值

在控制器中检测:某个配置项是否存在

1

2

3

4

5

6

7

8

9

namespace app\index\controller;

class Index

{

    public function index()

  {

    dump(\think\Config::has('app_status'));

  }

}

6.5 如何用助手函数:config('?配置参数');也返回布尔值

1

2

3

4

5

6

7

8

9

namespace app\index\controller;

class Index

{

    public function index()

  {

    dump(config('?app_status'));

  }

}

7 动态设置参数

7.1 配置项可以写在配置文件,也可以用Config::set()方法动态设置

7.2 Config::set(名称,值),可以逐个设置,也可用数组批量设置:Config::set(数组)

一、名值对方式,逐个设置

1

2

3

4

5

6

7

8

9

10

namespace app\index\controller;

class Index

{

    public function index()

  {

    \think\Config::set('site_domain','www.php.cn');

    dump(\think\Config::get());

  }

}

二、数组方式,批量设置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

namespace app\index\controller;

use think\Config;

class Index

{

    public function index()

  {

    $config = [

      'site_domain' => 'www.php.cn',

      'site_name' => 'PHP中文网',

      'php_tools' => 'PHP程序员工具箱',

    ];

    Config::set($config);