一、惯例配置
i. 定义配置文件 public/index.php
//定义配置文件目录 define('CONF_PATH', __DIR__ . '/../conf/') ; |
ii. 在application同级新建目录conf
iii. 打印当前配置 dump(config()) ;
iv. 上述打印出来的内容 即为thinkphp/convention.php 的内容
二、应用配置
i. 上述惯例配置是thinkphp框架提供的 应用于整个框架的默认配置 一般开发过程中 对惯例配置不做修改 防止后期的更新 维护 框架升级受到影响
ii. 应用配置只对整个应用有效 当前应用下的所有模块
iii. 与application同级新建 conf/config.php
config.php定义之前打印的配置信息:
config.php定义之后打印的配置信息:
说明 配置生效
iv. 原理: array_merge()
1. index函数中打印出array_merge后的结果
同理:惯例配置(thinkphp/convention.php)相当于 $arr1
应用配置(conf/config.php)相当于$arr2
Thinkphp对于多维数组 分区域的merge操作 相同的key 后面的值将之前的替换(覆盖)
三、扩展配置
i. 上述 可以通过应用配置 改变默认配置 通过应配配置 可以满足完成开发的需求
ii. 扩展配置:实际项目开发中 配置项很多 缓存配置 session配置 cookie配置 若集中在一个文件中配置 文件过大 不易维护 拆分成多个文件以便于维护
iii. 在conf目录下新建extra目录 (conf/extra) 新建配置文件测试
1. 如 新建文件email.php (conf/extra/email.php)
2. 打印配置
3. 特例 database (数据库的配置)
a) 正常思路: conf/extra/database.php
b) 打印 配置生效
但是:实际开发中 如果项目不是特别大 或者说配置项不是特别多 多数使用默认配置 就不需要建立扩展配置
几乎所有的项目都需要连接数据库操作 thinkphp允许我们将 database.php放在conf目录下
新建配置文件 conf/database.php
打印 配置生效
c) 此处 出现一个配置生效优先级的问题
惯例配置thinkphp/convention.php 有数据库的配置信息
应用配置 conf/config.php 有数据库的配置信息
扩展配置中 database.php 也有数据库的配置信息
经过多次merge操作 相同的key 应用配置中的值覆盖 惯例配置 扩展配置覆盖 应用配置
类似于就近原则
优先级(高->低) 扩展配置>应用配置>惯例(默认)配置
四、场景配置
i. 实际开发中 有很多场景 开发环境 测试环境 (准)生产环境 办公室环境 家里的环境....
ii. 如 有三个场景 A ,B ,C 以数据库配置为例 (不同场景开发 切换到不同场景的配置)
1. 应用配置文件 conf/config.php 配置’app_status’ => ‘’
2. 在conf/下 新增场景配置文件 a.php ,b.php ,c.php
3. 应用配置文件 conf/config.php 中 ‘app_status’=>’’ 指向a|b|c 就调用哪个场景的配置
A:
B:
C:
4. 总结 : 需要场景配置的时候
a) 应用配置文件中 conf/config.php ‘app_status’=>
b) 新建场景配置文件 如 conf/a.php ...
return [
'app_address' => 'a' , 'database' => [
// 数据库类型 'type' => 'oracle', // 数据库连接DSN配置 'dsn' => '', 'port' => '1521' , // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'testA', // 数据库用户名 'username' => 'oracle', // 数据库密码 'password' => 'oracle', // 数据库连接端口 'hostport' => '', ... |
c) 需要切换场景的时候 直接 应用配置文件
conf/config.php ‘app_status’=> 指向所需要的场景
注意:数据库的配置项 需要配置所有的 即推荐把 thinkphp/convention.php文件中 ‘database’=>所有内容全都拷贝过来 配置 貌似是个bug
五、模块配置
i. 之前上述配置 都属于引应用级别(所有模块都有效)
ii. 模块配置: 实现仅对当前模块配置有效
1. 背景: 当前有两个模块 admin | home
2. 在conf下新建两个目录 admin|home (对应两个模块 ) 目录下分别新建config.php(此文件名 算是规定的)
3. 分别打印出 admin|home 模块下的配置
配置生效 仅对当前模块有效 模块之间互不影响 extra扩展配置 同理
六、动态配置
i. 主要用于对当前控制器或者是某个方法 动态的配置设置
1. 当前控制器的配置 __construct() 构造函数中配置 ---对整个控制器有效
分别访问index|delete方法
2. 在方法中的配置 ---仅对当前方法有效
分别访问index|delete方法
七、Config类和config助手函数
i. Config类和config()作用: 对配置(惯例配置thinkphp/convention.php 应用配置conf/config.php以及扩展配置)的操作【has查询是否配置 set设置 get获取值等等】
ii. Config类在使用的时候 优先定义命名空间 use think\Config; 或者是带命名空间操作\think\Config::has(‘’)
config()可以直接使用
iii. Config类
iv. Config类 Config::get()
1. get() 可传参数string 参数名 ,string 作用域
参数为空 获取所有配置
对应的助手函数是 config()
a) use think\Config ;
b) $res = \think\Config::get() ;
v. 助手函数 thinkphp/helper.php
a) config()
b) 开发中 推荐使用Config类 来更改配置信息 如果在入口文件或者引入helper.php之前 定义过config()函数 那么就不能再通过config()获取的信息会有问题
c) 设置参数 Config::set() ---config(‘’,’’,’’)
d) Config::has(‘’) --- 判断是否配置 【参数不存在或者null都返回false】
i. 如 Config::has(‘username’) 判断username是否存在
ii. 对应助手函数 config(‘?username’)
八、环境变量的配置和使用
i. dump($_ENV) ; 需要php.ini中 variables_order = "EGPCS"
ii. Thinkphp5中 在application同级 新建文件 .env
iii. use think\Env ; Env::get(‘’)
iv. Env::get(‘pass’,’default’) 若是pass有值 则返回值 若没配置返回第二个参数default
v. 分组配置
vi. 配置场景(开发环境 生产环境...)
1. .env文件 ststus=dev如dev(开发环境)|test(测试环境)|pro(生产环境)
2. conf/config.php
3. conf/dev.php 根据不同的场景 新建test.php |pro.php
4. 根据.env文件的配置 切换场景...
5. 若是 在.env中 配置了数据库的信息 database
a) .env
b) conf/database.php
vii. 总结: 各个环境配置不同的.env 文件 切换环境的时候 只需要切换不同的.env文件即可
FAQ:
一、启动本地环境 查看端口占用
1.找到被占端口pid
netstat -aon|findstr "3306"
2.根据pid 查看进程
tasklist|findstr "1880"
3.结束进程
taskkill /f /t /im mysqld.exe
二、自定义common模块报错:
报错信息:
分析:
这是thinkphp的规定 默认common是公用模块 存放 通用方法 不允许在URL上直接访问
解决:
将重复性的代码 权限 数据处理放在common模块 简化程序
三、修改application目录
i. 将application目录重命名 app
ii. 修改public/index.php define(‘APP_PATH’ , __DIR__ . ‘/../app/’);