框架流程

2021-09-27 10:57:10
admin
629
最后编辑:admin 于 2021-10-05 16:34:55

zentaoPHP 框架采用单一入口模式开发,所有用户请求都是从入口文件(index.php)开始的,由入口文件集中调度控制,并且所有的应用的入口文件都是类似的。它的基本原理是通过设置 apache 或者其他 webserver,将所有的请求都转交给 index.php。index.php 加载框架文件,初始化应用,然后分析请求,得到请求对应对模块名、方法和参数,然后加载相应模块的 control 方法,model 方法,最后渲染模板,展示给用户。

入口文件中其实包括了框架执行的整个流程:

zentaophp.png

1.关闭错误输出并开启输出缓冲

error_reporting(0);
ob_start();

2.加载框架核心文件

3.0版本开始支对持框架核心扩展,它们继承自 base 文件夹中的原核心文件。

include './framework/router.class.php';
include './framework/control.class.php';
include './framework/model.class.php';
include './framework/helper.class.php';

3.创建应用

初始化 router 类,创建一个应用。

$app = router::createApp($appName, $appRoot, $className);

创建应用时都做了什么:

  • 设置应用相关路径;

  • 加载应用公共的主配置文件 config.php,生成 $config 全局对象;

  • 静态加载类库里的类(front、filter、dao、mobile);

  • 设置超级变量;

  • 设置 debug、错误句柄、时区、开启 session;

  • 自动连接到数据库,生成 $dbh 全局对象;

  • 加载 common 模块的语言文件,生成 $lang 全局对象;

4.加载公共模块

加载公共模块,实例化 common 模块的 model 对象 $common。公共模块比较特殊,它会执行每次请求都需要执行的操作。比如开启 session,设置头部信息等。

$common = $app->loadCommon();

5.解析请求

解析用户请求根据网站的请求类型分为 pathinfo(2) 和 get 两种形式。但是流程是一样的:

通过解析用户访问请求的 get 或 path_info 地址,最终得到将被调用的目标模块名、方法名和控制器文件。

$app->parseRequest();

6.加载模块

有了请求的目标模块名、方法名和控制器文件,接下来就根据这些来加载该目标模块。

$app->loadModule();

首先引入模块的控制器(control)文件:先检查是否有扩展目录,若没有则直接引入默认 control 文件,若有扩展目录,则引入请求方法的扩展文件,若没有请求方法的扩展文件,则还是引入默认 control 文件。

然后获取 control 文件中的类名,并创建控制器对象。

实例化控制器对象时都做了什么:

  • 把全局变量设为其成员属性,方便其子类调用;

  • 设置当前模块名和方法名,加载并实例化当前模块的 modle 类,可用 $this->模块名进行访问。

  • 设置客户端设备类型,并设置不同设备类型的视图文件前缀。

  • 初始化视图对象 $this->view,并将 全局变量设为其成员属性,方便调用。

  • 设置超级变量。

之后解析 URL ,得到请求的参数。

最后调用相应的方法,进行业务逻辑处理并渲染输出视图。

display() 方法渲染输出视图内容的流程:

  • 渲染方式:json 和 html(默认)

  • 设置视图文件:包括目标方法的主视图文件、视图扩展文件及钩子脚本。

  • 获取作用于当前方法页面的 CSS 和 JS(包括该模块公用的 CSS/JS + 当前方法的 CSS/JS + 扩展的 CSS/JS),框架会在头部和脚部模版文件中引入 CSS 和 JS。

  • 输出视图 output。

7.输出内容

最后因为 PHP 不能识别 UTF-8 BOM 头,所以框架在输出内容之前会先去掉 BOM 头。

echo helper::removeUTF8Bom(ob_get_clean());

注:入口文件并不一定都是指 index.php 文件,因为我们可以为不同的项目应用创建不同的入口文件,例如,前台的入口文件为 index.php ,后台的入口文件可能是admin.php。

发表评论
评论通过审核后显示。