phalapi-进阶篇3(自动加载和拦截器)
#phalapi-进阶篇3(自动加载和拦截器)#
##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架.
最近工作上事情比较多所以更新比较慢希望大家见谅!这一次带来的是对于此框架自动加载机制的一个小引导,简单的聊聊是如何实现此类机制的,了解之后要如何使用,在就一同探讨一下如何使用自动加载来构建自己的公用函数以及拦截器,和如何使用拦截器,在这里在此强调一下,在进阶篇中谈论思想会比较多大家可以慢慢消化很多地方都是此框架优秀的地方,拿出来分享是为了大家更好的了解框架并且可以运用到自己的代码中去!
附上:
开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release
##1. 自动加载机制##
关于自动加载使用phalapi框架的大家已经特别熟悉了,三层结构自动加载请求调用大家基本上感觉不到自动加载机制的存在,其实我们早就已经注册我们的文件,只是有一套完整的机制来封装这类事务让我们摸不着,我们的接口文件就是在index.php已经注册了
//装载你的接口
DI()->loader->addDirs(array('Demo', 'Library'));
大家不妨进入到addDirs里面瞧瞧
public function addDirs($dirs) {
if(!is_array($dirs)) {
$dirs = array($dirs);
}
$this->dirs = array_merge($this->dirs, $dirs);
}
其实当我们使用到addDirs的时候框架内部只是把我们定义好的路径存了起来,其实关键的地方已经在初始化PhalApi_Loader的时候被触发了,我们来一起看下PhalApi_Loader的构造函数
public function __construct($basePath, $dirs = array()) {
$this->setBasePath($basePath);
if (!empty($dirs)) {
$this->addDirs($dirs);
}
spl_autoload_register(array($this, 'load'));
}
第一句方法的意思是设置根目录,后面一个判断条件和我们使用addDirs是一样的作用,那么问题来了spl_autoload_register做了什么,官方给出的解释是这样的
将函数注册到SPL__autoload函数队列中。如果该队列中的函数尚未激活,则激活它们
参数
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数spl_autoload()
其实说白了就是当实例化类的时候找不到可以用的类的时候会来请求在spl_autoload_register中定义好的处理方法,在此框架汇中配置的处理函数也就是PhalApi_Loader/load函数
关于具体的如何实现如果匹配如果找到路径在如何引入这里就不一一说明了,当我们每次是new 一个类的时候都会去匹配有没有合适的,当没有合适的情况的时候,我们new的类名就是传递到PhalApi_Loader/load函数中去处理,根据框架规则引入我们需要的文件.
##2. 公用函数和拦截器##
当我们会使用自动加载机制了之后我们就可以来构建我们项目的公用函数和拦截器了,为什么要使用公用函数呢,在大部分请求下我们一套框架可能支持多个项目,当然项目与项目之间有不同的方法函数等等,但是也有公用的比如debug啊发送短信啊等等一些所有项目都可能去用到的一些功能性函数,或者是一些针对项目的拦截器啊
###2.1 公共函数###
首先在我们的根目录建立一个文件夹叫做general通用的意思,里面分别有两个文件夹Common(受TP的影响)和Intercept两个文件,我们在里面放入我们自己的文件,当然需要按照正确的规则比如Common_Base等
然后我们要使用的话当然要注册我们这个general文件作为自带加载文件,然后注册自己需要用的类,如下:
//加载项目通用文件
DI()->loader->addDirs('General');
//通用函数基础类
DI()->base = new Common_Base();
###2.2 拦截器###
对于API来说拦截器的意义是巨大了,为什么这么说呢应为API是提供服务器的,我们可以用拦截器做很多的时候,比如限制开放接口,参数转移,json解包,请求解密,token校验等等一些处理都可以在内部进行.
//拦截器
$Intercept = new Intercept_app_default();
//转换参数
$_REQUEST = $Intercept->turnparameter($_REQUEST);
可以作为参考,拦截器接受所有的post和get参数然后再内部统一做处理,参数转换,请求解密,token校验这些都是日常用到的不详提,这里哪一个有代表性的来说明一下就是json解包,为什么要json解包呢,应为在很多公司使用请求传参的时候都是封装成一个json请求过来的,框架接受是能接受到,但是无法使用框架自带的参数完整性校验机制了,令我非常难受(也有很多朋友也遇到此类问题),所有自己写了一个解包方法
//递归解包
function test($params, $server){
if(is_array($params)){
foreach($params as $k => $v){
$server[$k] = $v;
$server = test($v, $server);
}
}
return $server;
}
//模拟一个json数组
$params = array(
'a' => array(
'c' => 3,
'd' => 4
),
'b' => 2,
);
$server = array();
var_dump(test($params, $server));
我们获取到的返回结果是**array(4) { ["a"]=> array(2) { ["c"]=> int(3) ["d"]=> int(4) } ["c"]=> int(3) ["d"]=> int(4) ["b"]=> int(2) }**也就是把数组中的底层元素全部浮到了和a,b同级的目录并且也保证了a的数组完整性,这边必须要注意啊同名问题
##3. 总结##
本小节,主要讲述了一下关于自动加载的机制,以及为什么要使用拦截器已经目的和怎么让json通过拦截器也能使用框架的校验机制,那么今天就到这里了,希望此教程能够给你们带来帮助,在下一小节将会model层和事务进行已经深入的了解,祝大家天天开心~
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
官网QQ交流群:421032344 欢迎大家的加入!
- 大数据面试题整理
- 02-移动端开发教程-CSS3新特性(中)
- 强悍!Java 9 中的9个新特性
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- 44个Java代码性能优化总结
- 干货:Java正确获取客户端真实IP方法整理
- sublime学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 虚拟机设置桥接上网(下)
- WebSth 指纹识别插件简要分析
- Android实现3D层叠式卡片图片展示
- Android Studio屏幕方向以及UI界面状态的保存代码详解
- webshell,禁止你执行
- android实现下拉菜单三级联动
- Flutter 假异步的实现示例
- 详解Android4.4 RIL短信接收流程分析
- android 使用kotlin 实现点击更换全局语言(中日英切换)
- EasySec基于XP的渗透平台
- Android集成腾讯X5实现文档浏览功能
- 8个小时8个小时的上机课!!
- Android实现根据评分添加星级条
- Android悬浮窗的实现(易错点)
- phpcms上传导致getshell详解及案例