一、使用
在控制器层,会调用视图类的方法,加载页面文件并传入数据信息等。视图类已在容器类中加载完成了。
二、相关类
Manager类:抽象类,相当于抽象工厂模式的抽象工厂类(View类和Log类都继承自它)
成员变量:
app:容器类
drivers:驱动类实例数组
namespace:驱动类所在的命名空间
成员方法:
构造函数:初始化变量app
driver:获取驱动类
(1)参数为空时,获取默认驱动类(getDefaultDriver方法)
(2)不为空时,根据键值在变量drivers数组中获取(getDriver方法)
getDriver:根据键值在变量drivers数组中获取,没有则调用createDriver方法创建并保存
resolveType:获取驱动类型
resolveConfig:获取驱动配置
resolveClass:获取驱动类,根据变量namespace和参数获取驱动类名
resolveParams:获取驱动类参数,从配置中获取(调用方法resolveConfig)
createDriver:创建驱动类实例
(1)根据参数获取驱动类型(resolveType方法)
(2)判断根据驱动类型组成的方法是否存在,存在则直接调用方法创建驱动类
(3)不存在在调用resolveClass方法获取驱动类名,并在容器类中注册驱动类
forgetDriver:移除驱动实例
getDefaultDriver:抽象方法,每个子类必须实现,获取默认方法
__call:魔术方法:没有对应的方法时,启动此方法:调用驱动类中对应的方法(相当于将驱动类的方法委托给了此类)
View类:继承于抽象类Manager
成员变量:
namespace:同父类,初始化了一个值\think\view\driver\
data:保存模板变量,需传递给模板的数据
filter:内容过滤,保存的是函数
成员方法:
engine:获取模板引擎,调用方法driver
assign:为变量data赋值
filter:设置变量filter的值,参数是函数类
fetch:委托驱动类的fetch方法(调用方法getContent)
display:委托驱动类的display方法(调用方法getContent)
getContent:获取内容,参数是函数类,执行参数对应的函数,回调变量filter对应的函数
resolveConfig:重写父类的resolveConfig方法
getDefaultDriver:默认驱动
附:
(1)驱动类
Php类:处理模板中的php代码
Think类:委托于Template类进行模板处理(这个需要根据官网文档进行安装)
(2)配置文件
config/view.php
日志相关类
日志类、日志驱动类、日志渠道类
Log类:日志类,继承于抽象类Manager,还有接口类LoggerInterface
9个常量表示日志类型,对应的处理方法分别用于保存对应的日志
namespace:驱动类的命名空间
成员方法:
getDefaultDriver:默认驱动
getConfig:获取日志配置(读取日志文件)
getChannelConfig:获取渠道配置
channel:跟driver方法功能相当,区别在于,参数可以为数组,返回的是ChannelSet类
createDriver:重写父类createDriver方法,
(1)调用父类createDriver方法创建驱动类
(2)创建日志渠道类并返回(驱动类作为了参数)
clear和close:清空日志,清除日志渠道类中的log变量
getLog:获取已经保存的日志信息
save:保存日志,对变量drivers数组的元素进行循环,分别调用元素的save方法
record:调用日志渠道类的record方法进行保存日志
write:实时写入日志,调用record方法(注意参数)
log:记录日志信息,调用record方法,参数lazy正好和write方法相反
listen:添加日志写入监听事件,触发这些事件是在保存日志时,调用日志渠道类的save方法
Channel类和ChannelSet类:日志渠道类,ChannelSet类相当于Channel类的集合
成员变量:
name:驱动类型
logger:驱动类
event:事件类
lazy:是否实时写入
log:保存日志信息,数组
close:关闭日志的状态
allow:允许写入的日志类型
成员方法
构造函数:初始化各个变量
close:关闭日志,调用clear方法并标记状态(close的值)
clear:清空日志,清空数组变量log的值
record:记录日志
(1)根据参数,生成需要记录的日志内容,并保存至变量log中
(2)根据参数和变量lazy值来判断是否实时保存日志(保存时调用save方法)
write:实时记录日志,调用record方法(注意参数lazy)
log:记录日志,调用record方法(注意参数lazy,跟write方法中的相反)
getLog:获取日志信息
save:保存日志
(1)先判断并处理监听的事件
(2)调用变量logger(日志驱动类)的方法save进行保存,成功则清除日志信息(clear方法)
日志驱动类:File类和Socket类,相当于两种日志驱动策略
File类是把日志保存至本地
Socket类是把日志发送给其他服务器进行处理
每个日志驱动类中需要有方法save,用于日志渠道类的调用
File类:
整个流程:
(1)生成日志文件的路径和文件名;
(2)处理日志信息,将一些特殊类型的转为字符串等;
(3)将日志信息写入到文件中
配置参数:
time_format :日期格式
single:是否生成单日志文件(配置为字符串时可为文件名,默认是single)
file_size:日志文件的大小不能超过此配置
path:日志路径
apart_level:配置哪些日志类型需要单独生成日志文件
max_files:日志文件数不能超过此配置,超过时将会删除第一个日志文件
json:是否将日志信息转为json格式
json_options:生成json格式时的参数(json_encode的第二个参数)
format:打印日志的格式
构造函数:初始化一些配置信息
save:日志写入接口
(1)调用getMasterLogFile方法,获取日志保存的路径名
(2)循环处理日志信息:第二层循环:先处理日志内容,不是字符串的转为字符串,判断是否需要转为json格式等,第一层循环:再根据日志信息的级别(类型)检测配置信息是否需要独立生成日志文件(调用getApartLevelFile方法生成路径名),是则直接调用write方法进入下个处理
(3)最后调用write方法写入日志
write:写入日志文件
(1)根据配置先检查日志文件的大小,如果超过配置,则将旧的日志文件重新命名(调用checkLogSize方法)
(2)将日志信息数据用换行链接起来,再调用php内置error_log函数写入日志信息
getMasterLogFile:生成日志文件路径字符串
getApartLevelFile:生成单独的日志文件路径
checkLogSize:调用函数rename对旧的日志文件重新命名