理解Flight框架核心
http://blog.csdn.net/sky_zhe/article/details/38906689
Flight 框架
Flight类
1、加载 autoload.php ,启动框架的自动加载机制
实际执行的是 Loader::autoload 函数, 关键代码
- $class_file = str_replace(array('\\', '_'), '/', $class).'.php';
可以看到是依据PSR-0标准来做的,_ 也被转化为目录
另外同时定义了,根目录是项目根目录
2、启动 Engine.php
使用 __callStatic 函数将对调用转到 Engine 类上:
- return \flight\core\Dispatcher::invokeMethod(array(self::$engine, $name), $params);
Engine类
1、首先是个容器
- protected $vars; //变量
- protected $loader; //类
- protected $dispatcher; //函数或方法,(称为事件)
对变量的储存和使用,是通过 has,get,set,clear 等方法
2、对类(component)的管理,通过 Loader 类
Loader 通过 register 方法注册类及加载方法,通过 load 方法加载(实现了单例模式)
框架本身已经实现了 request,response,router和view等类
也可以使用Engine的register 方法添加自定义的类
3、对事件(函数或方法)的调用,通过 Dispatcher 类
对函数或方法命名,定义一个事件
Dispatcher 通过 set 注册事件,get获得事件,并通过 run 执行事件,
在run过程中,很重要的,就是可以hook一个事件,
- public function hook($name, $type, $callback) {
- $this->filters[$name][$type][] = $callback; // type 可以是before or after
- }
也就是在事件被实际调用(execute)前后,调用(filter)所有的自定义函数(在filters数组里面)
(最后执行函数的是callFunction,方法的是invokeMethod)
框架本身定义了多个事件:
start 是框架开始执行,stop 是结束,route是添加路由,还用redirect等等
render是显示页面,json,jsonp等等
这些事件的实际执行代码也在Engine类中(以_开头)
可以用map添加自定义事件,用before,after分别hook事件前后
4、类和事件的调用
如上,类和事件管理在Loader 和 Dispatcher 中,但都是通过Engine类调用的
- public function register($name, $class, array $params = array(), $callback = null) {
- $this->loader->register($name, $class, $params, $callback);
- }
- public function map($name, $callback) {
- $this->dispatcher->set($name, $callback);
- }
- public function before($name, $callback) {
- $this->dispatcher->hook($name, 'before', $callback);
- }
- public function after($name, $callback) {
- $this->dispatcher->hook($name, 'after', $callback);
- }
要获得类(如上,实际存在dispatcher中),需要通过方法调用(因为是通过 __call 实现的):
- $request = $this->request();
- $response = $this->response();
- $router = $this->router();
变量可以直接通过 get 获得
5、错误处理 handleErrors 和 配置
通过 set_error_handler 和set_exception_handler 设置自定义错误处理代替php默认的处理,也是php框架的标配了。
配置 就保存在 Engine 类的vars 里面,可以通过 set,get方法处理
Flight类 只有静态方法,且全部委托 Engine 对象,
Engine对象
用来管理变量,类或事件的方法,如 set,get,register,map,before,after 就是所谓核心方法,
而所谓扩展方法,指注册到 Dispatcher中的事件,其实也是函数。而系统的事件,也是在 Engine中实现的。
Engine对象中,核心方法管理对象和事件,扩展方法则把事件任务分给了dispatcher ,对象任务分给loader
系统事件
1、start
读取request,路由
设置输出缓存 和配置(就是变量,这些设置是在engine->ini中设置的,且硬编码无配置文件)
添加 after hook,这个事件也就是调用stop事件,这个此时动态添加的hook事件也会执行,最终输出缓存
匹配分发路由,
2. stop
简单的输出缓存(根据上面,此事件作为 start事件的hook after事件被自动调用的。
理解Flight框架核心的更多相关文章
- 《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》(第2章)
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 《深入理解Spark:核心思想与源码分析》一书正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 理解maven的核心概念
原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 好久没进行java方面的开发了,最近又完成了一个java相关的 ...
- Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍
本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...
- Vue框架核心之数据劫持
本文来自网易云社区. 前瞻 当前前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Angular.Regular.Vue.React等等,它们最大的优点就是可以实现数据绑定,再也不需 ...
- 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 通过Ruby On Rails 框架来更好的理解MVC框架
通过Ruby On Rails 框架来更好的理解MVC框架 1.背景 因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...
随机推荐
- eval和new Function的区别
eval和new Function都可以动态解析和执行字符串.但是它们对解析内容的运行环境判定不同. var a = 'global scope' function b(){ var a = 'loc ...
- hdu 4631Sad Love Story<计算几何>
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意:依次给你n个点,每次求出当前点中的最近点对,输出所有最近点对的和: 思路:按照x排序,然后用s ...
- Nginx源码结构
上一章对Nginx的架构有了一个初步的了解.这章,为了对源码仔细的剖析,先要对Nginx的源码结构有一个了解.从宏观上把握源码模块的结构. 一.nginx源码的3个目录结构 在安装的nginx的目录下 ...
- Android--简单开发和使用ContentProvider数据共享
今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子: 我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你 ...
- golang的哪些坑爷事: package实践
在golang中package是个困惑的概念, 特别是package还可以与folder不同名, 委实让我恶心了一把. 关于golang的package的最佳实践: package is folder ...
- Karaf 依赖equinox and felix,karaf 本Apache的很多项目作为基础框架
6月17日是Apache Karaf作为Apache顶级项目.Karaf是个运行时包,包含了一个OSGi框架(Equinox或Felix).一个命令shell(Felix Gogo)及默认情况下内置的 ...
- 第2章 HelloWorld
----------------------------------------- 2-2 在设置应用图标的时候,一定要注意添加的图片一定是.ico 的要求格式(32*32像素). 可以在网上下载 ...
- 【ConnerStone】SVN代码管理 - 基本使用
第一步,链接服务器,创建代码管理仓库 第二步,输入服务器的配置,链接服务器(例子是以svn:// 为例子) 第三部 ,链接成功后,SVN的基本界面组成 第四步 从仓库中check out你需要的项目 ...
- 安装v2meet客户端 进入会议依然 提示 您还未安装视频会议的客户端,请下载安装
解决办法 1.安装软件,要用管理员权限安装 2.装一个360浏览器,登录会议,这样就成功了.原装IE9却不行. 估计是IE9做了一些安全限制,由于时间关系就没有再处理了.
- 【每日scrum】NO.5
尝试采用自己的地图,绘点并计算路径,但是地图打开出现问题.