摘要
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
)调用的是模型类名对应的数据表。