一、进入模型层
在服务类中已经提到,model层使用服务类的流程进行了初始化:注册模型服务类ModelService并启动服务类方法boot,在boot方法中调用了Model类的几个静态方法,设置Model类的一些静态属性。当创建一个模型对象时,会调用Model类的构造函数,这样就进入到模型层部分。
二、相关类
ModelService类:模型服务类
成员方法:
boot:调用Model层的四个静态方法(setDb setEvent setInvoker maker:如果不存在方法会调用魔术方法__callStatic进行处理)进行设置一些属性。
Model类:模型层的抽象类
成员方法:
maker:为静态变量数组maker添加元素(函数类型的参数)
setDb:设置静态变量db的值
setInvoker:设置静态变量invoker的值
构造函数:
(1)对传入的数组中废弃字段进行处理,并保存原始数据
(2)循环处理静态变量数组maker中的元素(call_user_func来调用回调函数)
回调函数是通过maker方法的参数传过来的,在ModelService类的boot方法中有调用maker方法,参数是一个函数对象,在构造函数中使用call_user_func来回调用这个函数对象:代码如下,设置自动写入的时间字段和设置时间的格式
function (Model $model) {
$config = $this->app->config;
$isAutoWriteTimestamp = $model->getAutoWriteTimestamp();
if (is_null($isAutoWriteTimestamp)) {
// 自动写入时间戳
$model->isAutoWriteTimestamp($config->get('database.auto_timestamp', 'timestamp'));
}
$dateFormat = $model->getDateFormat();
if (is_null($dateFormat)) {
// 设置时间戳格式
$model->setDateFormat($config->get('database.datetime_format', 'Y-m-d H:i:s'));
}
}
注意:这个函数中有个isAutoWriteTimestamp方法(知识点:trait的用法)
魔术方法__call:类中没有调用的方法时,会调用这个魔术方法
(1)判断静态属性macro中是否存在
(2)判断方法名是否是withattr,如果是就调用方法withAttribute
(3)调用方法db返回的查询类中的对应方法
db:获取数据库查询对象
connect:用于切换数据库连接
DbManager类------->子类Db类:主要就是创建连接,获取配置信息等
连接类:接口ConnectionInterface------->抽象类Connection--------->抽象类PDOConnection----------->Mysql类
数据库的链接,PDO预处理,绑定参数等,一些数据库的操作,用Builder类生成的sql模板进行预处理,Query类中保存的数据进行参数绑定
数据查询类:抽象类BaseQuery------->Query类
数据库驱动类:抽象类Builder--------->Mysql类
将Query类中的查询参数组装成sql模板