TL;DR
Yaf 版本为 2.3.0。
本篇主要简单记录了:
- yaf_request.c
- yaf_response.c
- yaf_router.c
- yaf_session.c
源码阅读过程中的一些问题和理解。
yaf_request.c
定义了 Yaf_Request_Abstract 这一抽象类。同时以及声明了这些类型的 getter / setter 方法。
一个 yaf 的 request 包含了需要调用的 Controller / Action 等等信息。
一个应用场景是在开发过程中,可以通过插件在分发前根据特定情况改动 request 的信息,使得可以更改请求触发的操作对象。
yaf_response.c
定义了 Yaf_Response_Abstract 这一抽象类。
Response 对象中关键的操作是返回内容的操作以及实际返回内容的方法。
返回内容可以在多次的 foward 等过程中,在当前返回数据之前或者之后进行追加操作,也可以直接替换最终返回的数据。这些操作都通过 yaf_response_alter_body() 函数实现,这一函数可以支持:
- YAF_RESPONSE_PREPEND 添加到头部
- YAF_RESPONSE_APPEND 追加到尾部
- YAF_RESPONSE_REPLACE 修改数据
相对应的就是 response 对象中的 prependBody() / appendBody() / setBody() 方法。
对于 HTTP 协议上诸如 Header 等内容的操作,也在这个文件中进行了定义。
yaf_router.c
这是 yaf 框架最为重要的组成部分之一。
在此文件中,定义了 Yaf_Router 这一 class。同时也定义了 static / simple / supervar / rewrite / regex / map 这几个路由规则。
路由过程与添加路由规则的顺序相反,在上一篇文章中有所提及。
无论是内置路由规则,还是新增的路由规则,都需要实现 Yaf_Route_Interface 这一个接口,实现 route() 方法,接受 request 对象,认定为匹配之后,修改当前请求对象的 module / controller / action,并返回真值。
如果没有设定,则使用 static 路由规则。
实际使用过程中,可以通过当前 app 的 dispatcher 中的 router 添加一个实例化的路由规则,实现自己路由的目的。
assemble()
assemble() 方法是一个根据自身路由规则拼装出合理 url 的工具,每一个路由类型都需要结合自身的规则,来实现这个方法。
Yaf 路由时需要知道 module / controller / action,所以在调用 assemble() 时,自然也要通过数组的方式,传递这些参数,即源码中的:
- YAF_ROUTE_ASSEMBLE_MOUDLE_FORMAT :m
- YAF_ROUTE_ASSEMBLE_CONTROLLER_FORMAT :c
- YAF_ROUTE_ASSEMBLE_ACTION_FORMAT :a
这是一个了解各个路由的手段。
关于具体路由的使用,另起篇幅。
yaf_session.c
定义了 Yaf_Session 这一个类。
可以通过 getInstance() 方法获得单例。
Yaf_Session 类只是对 $_SESSION 进行了封装,实际上操作的还是 $_SESSION 变量,在初始化过程中将 $_SESSION 变量和成员属性 sess 进行了关联。