当前位置:  首页>> 技术小册>> ThinkPHP项目开发实战

目前大部分框架的习惯都是“配置大于编码”,ThinkPHP 5也不例外。配置优先的方式可以让我们只修改配置部分,不需要修改程序源代码,有效减少了程序出错的可能。

ThinkPHP 5默认使用PHP数组方式定义配置,支持惯例配置、公共配置、模块配置、扩展配置、场景配置、环境变量配置和动态配置。

ThinkPHP 5的配置非常灵活,举一个简单的例子:假设你在家里、公司两个不同的地点开发同一个项目,通过配置app_status,系统就会自动加载不同环境下的配置文件,实现“无缝开发”。

怎么样?是不是很期待呢?那就跟我一起来学习一下ThinkPHP 5的配置吧!

配置的路径

ThinkPHP 5默认配置目录为application目录,该目录(不包括子目录)下的文件为全局配置,整个程序都可以访问到。如果是模块(如index模块)下的配置,就只对该模块生效。

如果需要将application/config.php的配置按照组件拆分(如拆分为数据库配置、缓存配置等)为多个文件,那么请放在application/extra目录下,文件名为键名,文件直接返回数组即可。

将配置文件拆分有利于规范项目文件结构,尽量做到单一职责,一个配置文件只负责一个组件/功能。

配置的格式

ThinkPHP 5默认的格式为PHP数组,这也是ThinkPHP 3的做法,不过需要注意的是ThinkPHP 5推荐数组键名使用小写,而ThinkPHP 3的键名是大写。键值支持PHP所有数据类型,包括简单类型(字符串、数字、布尔值等)以及嵌套数组等。

配置的加载顺序

ThinkPHP 5配置加载顺序如下:

(1)框架配置(框架自带的默认配置)。

(2)全局配置(application/config.php)。

(3)扩展配置(application/extra目录下的配置文件)。

(4)场景配置(上文提到的app_status常量,如定义app_status为company,框架就会加载application/company.php配置)。

(5)模块配置(application/模块名/config.php,支持app_status常量,如第4点的app_status则会加载application/模块名/company.php配置)。

(6)动态配置(使用Config类进行操作)。

可以看到优先级是从上到下越来越低,希望读者能记住配置的加载顺序,这个顺序在开发中会带来很大的方便。

配置的读写示例

使用配置的最终目的是方便开发,也就是在合适的时候需要读写配置,比如实例化数据库的时候需要读取database配置。ThinkPHP通过Config::get和Config::set读写配置。

下面我们来看配置的一个示例,这个示例将完成以下内容的验证:

  •  惯例配置的加载

  •  全局配置的加载

  •  扩展配置的加载

  •  场景配置的加载

  •  模块配置的加载

  •  动态配置的加载与读写

步骤说明如下:

(1)解压缩ThinkPHP 5核心版。

(2)运行PHP服务器

(3)编辑application/index/controller/Index.php:

  1. <?php
  2. namespace app\index\controller;
  3. use think\Config;
  4. class Index
  5. {
  6. public function index()
  7. {
  8. echo '<pre>';
  9. echo json_encode(Config::get(), JSON_PRETTY_PRINT);
  10. echo '</pre>';
  11. }
  12. }

(4)访问http://localhost:8080 ,可以看到输出了一段JSON,这就是ThinkPHP的默认配置(惯例配置)。

(5)新建application/extra/amqp.php文件(如果extra目录不存在,就手动创建)。

  1. <?php
  2. //消息队列配置
  3. return [
  4. 'conn' => 'amqp://root:root@localhost:5672',
  5. ];

(6)刷新页面,可以看到有刚才配置的amqp配置。

(7)将application/config.php的app_status更改为home。

(8)添加application/home.php。

  1. <?php
  2. return [
  3. 'amqp' => [
  4. 'conn' => 'I am here',
  5. ],
  6. ];

(9)刷新页面,可以看到amqp的输出已经变成home.php中定义的内容。

(10)添加application/index/config.php。

  1. <?php
  2. return [
  3. 'amqp' => [
  4. 'conn' => 'I am index module amqp',
  5. ],
  6. ];

(11)刷新页面,发现amqp又发生了变化,与上面定义的文件一致。

(12)添加application/index/home.php。

  1. <?php
  2. return [
  3. 'amqp' => [
  4. 'conn' => 'I am index module home config',
  5. ],
  6. ];

(13)继续刷新页面,发现amqp又发生了变化,与上面定义的文件一致。

(14)编辑application/index/controller/Index.php,添加rw方法测试配置的读写。

  1. public function rw()
  2. {
  3. var_dump(Config::get('test'));
  4. Config::set('test', 'aaaa');
  5. var_dump(Config::get('test'));
  6. }

(15)访问http://localhost:8080/index/index/rw ,可以看到如下输出:

  1. NULL string(3) "aaaa"