分享

QEEPHP一次完整请求的过程(转)

 sumi2005 2014-08-02

首先,看如下代码:

$app_config = require(dirname(__FILE__) . '/_code/config/boot.php');

require $app_config['QEEPHP_DIR'] . '/library/q.php';

require $app_config['APP_DIR'] . '/myapp.php';

解析:

  • 通过调用boot.php文件将此网站基本的配置信息保存在变量$app_config
    • 其中比较重要的配置信息有:框架根目录的指定、运行模式的选择、各个配置程序的目录设定、定义缓存配置文件要使用的缓存服务及策略
  • 包含核心文件q.php ,核心文件主要内容我总结为以下几类:
    • 调用类库及其文件的load方法。
    • 读取和设置配置信息的方法。
    • 注册对象及其判断是否注册过对象的方法。
    • 缓存读写方法。
    • 自动includ设置、渲染控件方法、处理数组的方法。
    • 自定义的常用4个函数
    • Q::registerAutoload()这个函数将注册自动类的载入方法。
  • 包含应用程序的基本启动流程和初始化操作的myapp类库
注:在以上的步骤中仅仅保存了一个配置变量、注册了一个自动类载入的方法和包含了所需要的核心类库文件Q和启动文件  myapp

接下来进入正题开始初始化流程:

先上代码:

$ret = MyApp::instance($app_config)->dispatching();

if (is_string($ret)) echo $ret;

return $ret;

虽然这里的代码很简单,但它完成了一次完整的响应过程。

分开来详细说明:

MyApp::instance($app_config)

解析:这是一个初始化MyApp类的一个操作;

打开此文件首先查看instance方法;它仅仅是做了一个  new MyApp的一个操作-->

继续追踪构造函数,以下操作被执行:

  • 是否记录执行脚本开始时间(一般开发模式需要查看页面载入时间)
  • 禁止 magic quotes、处理转义的全局变量
  • 自定义异常处理
  • 开始载入配置信息;由于配置信息室需要缓存的,所以这里会判断配置信息的缓存是否存在或者是否失效,如果有缓存则直接调用缓存文件,并用Q::replaceini($config)注册整个系统所需要的配置信息。
    • 这里要注意,由于系统生成项目的配置信息不是所有的,你可以根据项目根目录下 qeephp/library/_config/default_config.php文件查看qeephp所有的配置项,根据自己的需要增加你所需要的配置信息即可;
    • 如果需要增加额外的配置文件,如需要SEO.YAML专门存储所需要的title、content、keyword,则需要在方法_initConfig()方法下增加调用的配置文件,如在files数组中增加一项SEO的信息。
  • 设置SESSION、默认时区设置、导入类搜索路径、将myApp的注册对象添加到QEEPHP的核心注册表中。
这样基本上完成了MyApp::instance($app_config)的初始化过程;接下来就是要处理所需要的请求了。这里拿HELLOWORD的例子做说明。

上代码:

$ret = MyApp::instance($app_config)->dispatching();

执行MyApp的方法dispatching()

解析:

  • 构造运行时上下文对象
    • 如果使用的不是standard,则需要在此进行路由的初始化设置;
    • 获取当前请求URL的$_GET参数,经过过滤和规则化赋给context的4个基本属性值controller、action、namespace、module。
  • 将当前请求中包含的控制器、动作、名字空间和模块名提取出来,构造为一个 UDI
  • 使用authorizedUDI方法检查获取到的角色信息是否允许访问当前的UDI(即当前请求的URL),如果不允许访问则返回_on_access_denied方法输出304错误。
  • 组合当前UDI所需要的控制器名称、路径、类名,如果不存在则在此返回404错误信息;
  • 如果该控制器存在,且当前action(动作)已经定义,则实例化此控制器。
    • 实例化此控制器将触发生成的abstract.php和qeephp/library/web/controller_abstract.php的构造函数过程
      • abstract.php将保存MyApp对象到$this->_app属性里
      • controller_abstract.php将context的对象保存在$this->_context属性里
  • 利用existsAction方法检查当前动作是否存在,如果不存在首先调用abstract.php中定义的_on_action_not_defined的404错误,如果未定义则调用MyApp文件的_on_action_not_defined的404错误;如果存在则call_user_func_array(array($this, $action_method),$args)执行当前动作的代码,然后实例化模板引擎QView_Render_PHP;

    对于模板引擎对象,首先导入基本的URL、当前UDI为变量,然后将控制器中的$this->_view数组变量传进模板引擎对象中的_vars属性里。

  • 判断返回的$response的值,如果在控制器中使用$this->redirect()或者$this->_redirect()则更改所需要跳转的URL重新执行MyApp的dispatching()方法。如果没有跳转结尾,则执行模板引擎对象中的execute方法。
  • 模板引擎中execute–渲染视图并返回渲染结果。

    $output = $this->_parser->assign($vars)->parse($filename);由于此过程还没太多时间研究,对view层里使用block、element、control等的渲染基本上都在这几个方法中实现,等有时间了再补充进来。

这样,基本上一次请求的所有处理过程就结束了,而dispatching()的返回值就是最后的html代码,输出$ret即结束了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多