摘要
ThinkPHP5 从入门到深入学习,结合实战项目深入理解 ThinkPHP5 的特性和使用方法,了解 ThinkPHP5 的数据库访问和 ORM 思想,学习使用查询构造器、日志以及初步了解异常处理机制。
1.将Exception修改为全局Exception基类,而不是think\Exception
`think\Exception => \Exception => Throwable`
`HttpException => \RuntimeException => \Exception => Throwable`当访问的控制器不存在、url 错误时,属于 HttpException 异常。 而原先定义的render()和recordErrorLog()方法要求接收的参数类型是think\Exception,由于HttpException不是继承于think\Exception,不能转化为think\Exception,所以会报错。
解决:使用全局 Exception 基类后,既支持 HttpException,又支持 think\Exception。子类可以自动被转化为父类的类型。 Exception 基类是所有异常类的基类。
2.补充:PHPStrom 快捷键:
1、为什么不使用原生的查询语句而使用查询构造器?
2、对查询构造器的理解
1.查询语句 = 链式方法 + 执行方法
2.链式方法:
只会返回 Query 对象,不是查询结果
3.执行方法:
1.链式方法说明(where):
where(‘字段名’,‘表达式’,‘查询条件’)
2.三种实现方式:
// 通过use来使用外部的数据
where(function ($query) use ($id){
$query->where('banner_id', '=', $id)
})1.database.php =》 debug=true
2.config.php =》 app_debug=true
3.config.php =》 log =》 level =》sql
'log' => [
日志记录方式,内置 file socket 支持扩展
'type' => 'File',
日志保存目录
'path' => LOG_PATH,
日志记录级别
'level' => ['error', 'sql'],
],不在配置文件中开启日志
ExceptionHandler=>recordErrorLog 方法中开启日志仅仅在发生异常时写入。
所以对于全局的情况,将日志手动添加到入口文件中,对所有调用都开启 sql 日志
??这样和在配置文件中开启日志有什么区别?
1.ORM 理解:
ORM = Object Relationship Map
对象关系映射:将每张数据表看作是一个对象
2.模型(TP5 模型)–ORM 实现的具体机制
=> 业务的集合= 数据库查询+业务逻辑+...
【注】模型与数据表不是一一对应的关系,简单的业务逻辑看上去是一张表对应一个模型,但复杂的业务逻辑(需要分层)可能是横跨多个表。
模型不仅仅只是 model 这一层,复杂的业务还可以继续划分,tp5 中有 model(数据层,细),service(服务层,粗),logic(逻辑层)
1.model/Banner.php 继承 Model 类之后,就成为了模型,就可以使用模型类已经封装好的方法(get),而不用自定义方法(getBannerById)。
$banner = BannerModel::getBannerById($id);
// => 返回数组
//等价于
$banner = BannerModel::get($id);
// => 返回对象,便于处理查询结果2.tp5 自动将对象序列化,序列化的格式根据配置文件中的配置项default_return_type转化为相应的格式。
// config.php
'default_return_type' => 'html'3.自定义模型方法(getBannerById)调用的是指定的数据表,而模型类自动的方法(get)调用的是模型类名对应的数据表。