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文件,修改如下:
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- $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) }
如果有值相同的数据,则取得是先增加的那一条