1.修改默认的应用名称application=>app:
找到入口文件,在最后的Container::get之前定义目录名称变量define('APP_PATH','../app/'),及修改
Container::get('app')->run()->send();
为
Container::get('app', [APP_PATH])->run()->send();
2.将多个模块中的view剥离统一在同一个文件夹public/view下:
TP5.1手册中是这样描述的:【可以用 view_base 模板引擎参数定义全局的视图根目录,然后模块作为子目录。】,即在配置文件template中设置【'view_base'=>'view/'】。我们来看看这里是如何实现的:
(1)通过我们定义的控制器,在PHPstorm中点击fetch()方法跳转到TP的Controller.php => fetch() => View.php => fetch(),我们看到这两行代码:
try {
$method = $renderContent ? 'display' : 'fetch';
$this->engine->$method($template, $vars, $config);
}...
(2)这里可以看到调用了engine对应的display或者fetch方法,我们再在当前文件中搜索小engine属性赋值,可以看到:
$this->engine = Loader::factory($type, '\\think\\view\\driver\\', $options);这样
这样我们就找到了所对应的底层文件最后在thinkphp\library\think\view\driver下面,最终定位到这么个方法:parseTemplate(),找到根据【view_base】定位自定义的视图文件路径的规则,也就明白了该怎么定义【view_base】
$path = $this->config['view_base'] . ($module ? $module . DIRECTORY_SEPARATOR : '');
3.多模块多数据库配置应用方案:
(1)方案一:在对应的模块中增加对应的数据库配置文件,加入有一个问题模块question,对应数据库名称加question_db,则在question模块中增加config/question_db.php,return [数据库配置],然后在模型中的:
protected function initialize()
{
parent::initialize(); // TODO: Change the autogenerated stub
$this->connection = config('question_db.');
}
如此,实例化模型的时候可以正确连接数据库
(2)方案二:只修改config/database.php文件,修改如下:
// +----------------------------------------------------------------------
$dbCommon = [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => '',
// 用户名
'username' => 'root',
// 密码
'password' => 'root',
// 端口
'hostport' => '3306',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'q_',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 自动读取主库数据
'read_master' => false,
// 是否严格检查字段是否存在
'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',
// 是否需要断线重连
'break_reconnect' => false,
// 断线标识字符串
'break_match_str' => [],
];
$dbConfig = [
'admin_db' => [
// 数据库名
'database' => 'admin_db',
],
'question_db' => [
// 数据库名
'database' => 'question_db',
],
];
//合并基本数据库配置
array_walk($dbConfig, function (&$v, $k, $dbCommon) {
$v = array_merge($dbCommon, $v);
}, $dbCommon);
return $dbConfig;
修改完成后,在要实例化的模型中设置$connection属性为数据库配置的对应的键名question_db即可:
protected $connection = 'question_db';
这样也可实现效果。
4.模板需要输出HTML标签文本,但是TP5.1默认自动转换
(1)TP5.1模板默认自动转换函数:
'default_filter' => 'htmlentities', // 默认过滤方法 用于普通标签输出
具体代码在:thinkphp\library\think\template.php
public function parseVarFunction(&$varStr, $autoescape = true)
{
if (!$autoescape && false === strpos($varStr, '|')) {
return $varStr;
} elseif ($autoescape && !preg_match('/\|(\s)?raw(\||\s)?/i', $varStr)) {
$varStr .= '|' . $this->config['default_filter'];
}
.......
}
可以看到检测到有【|raw】则不增加默认htmlentities转换。
TP5.1手册介绍如下:
5.模型方法
(1).新增数据save()
a.过滤非数据表字段
$model->allowField(true)->save($data,$where=[],$sequence=null) [$data可以是表单提交的数组,也可以是自己组装的数组][$where,当数据存在时的更新条件,只有save做更新数据时有效][$sequence自增序列名,一般就是主键名称]
b.新增数据
假如有两组数据$data1,$data2
$model = new Users();
$model->allowField(true)->save($data1);
$model->allowField(true)->save($data2);
这种情况下只有第一条数据能够新增成功,第二条新增不了。这个问题可以这样解决:
(1). 模型方法
$model->allowField(true)->isUpdate(false)->save($data1);
$model->allowField(true)->isUpdate(false)->save($data2);
或者:
(2).静态方法
UsersModel::create($data1)
UsersModel::create($data2)
d.获取某一列的数据:column(field,keyField);用keyField作为键名的field列数组
$model->limit(3)->column('name','wid'); 打印结果: array(3) { [1] => string(18) "重庆公交坠江" [2] => string(18) "武汉长江二桥" [3] => string(12) "征地赔偿" }
e.更加字段的值来查询:
$data = $model->getByName('重庆');
结果:
array(8) {
["wid"] => int(1)
["name"] => string(18) "重庆"
["display"] => int(1)
["num"] => int(10)
["sort"] => int(1)
["create_time"] => string(19) "0000-00-00 00:00:00"
["update_time"] => string(19) "2018-12-19 18:42:17"
["enabled"] => int(1)
}
如果有值相同的数据,则取得是先增加的那一条