Listening to the Words

TP5场景配置(未定义数组索引: scheme)解决

场景配置

每个应用都可以在不同的情况下设置自己的状态(或者称之为应用场景),并且加载不同的配置文件。

举个例子,你需要在公司和家里分别设置不同的数据库测试环境。那么可以这样处理,在公司环境中,我们在应用配置文件中配置:

'app_status'=>'office'

那么就会自动加载该状态对应的配置文件(默认位于application/office.php)。
如果我们回家后,我们修改定义为:

'app_status'=>'home'

那么就会自动加载该状态对应的配置文件(位于application/home.php)。

状态配置文件是可选的

按照以上配置:

return [
     // 应用命名空间
    'app_namespace'          => 'app',
    // 应用调试模式
    'app_debug'              => Env::get('app.debug', true),
    // 应用Trace
    'app_trace'              => Env::get('app.trace', false),
    // 应用模式状态,如果.env未注册,使用默认数据库database
    'app_status'             => Env::get('app.status','database'),
    // 是否支持多模块
    'app_multi_module'       => true,
    // 入口自动绑定模块
    ]

访问页面的时候报出异常:

《TP5场景配置(未定义数组索引: scheme)解决》

使用xdebug跟踪代码发现,parseDsn($dsnStr)方法中,$dsnStr参数只有数据库名字被传入了,其他字段均为空,问题就在这里.

查tp官方论坛有的朋友也遇到这个问题,他的解决办法是:

《TP5场景配置(未定义数组索引: scheme)解决》

这种更改框架底层的方式十分不可取,并且问题也不再这里,正确的解决办法是(很简单):

home.php


return [ 'database' => [ // 数据库类型 'type' => Env::get('database.type', 'mysql'), // 服务器地址 'hostname' => Env::get('database.hostname', ''), // 数据库名 'database' => Env::get('database.database', ''), // 用户名 'username' => Env::get('database.username', ''), // 密码 'password' => Env::get('database.password', ''), // 端口 'hostport' => Env::get('database.hostport', ''), // 连接dsn 'dsn' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => Env::get('database.charset', 'utf8'), // 数据库表前缀 'prefix' => Env::get('database.prefix', 'fa_'), // 数据库调试模式 'debug' => Env::get('database.debug', true), // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => false, // 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s 'datetime_format' => false, // 是否需要进行SQL性能分析 'sql_explain' => false, ], ];

将配置文件变成二维数组,就可以加载了

点赞