首页 > 技术文章 > TP5菜鸟之路

itwlp 2018-12-25 11:21 原文

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)
}
如果有值相同的数据,则取得是先增加的那一条

  

 

推荐阅读