phalapi-进阶篇3(自动加载和拦截器)

#phalapi-进阶篇3(自动加载和拦截器)#php

##前言## 先在这里感谢phalapi框架创始人@dogstar,为咱们提供了这样一个优秀的开源框架.git

最近工做上事情比较多因此更新比较慢但愿你们见谅!这一次带来的是对于此框架自动加载机制的一个小引导,简单的聊聊是如何实现此类机制的,了解以后要如何使用,在就一同探讨一下如何使用自动加载来构建本身的公用函数以及拦截器,和如何使用拦截器,在这里在此强调一下,在进阶篇中谈论思想会比较多你们能够慢慢消化不少地方都是此框架优秀的地方,拿出来分享是为了你们更好的了解框架而且能够运用到本身的代码中去!json

附上:api

官网地址:http://www.phalapi.net/数组

开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release服务器

##1. 自动加载机制##app

关于自动加载使用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的构造函数post

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 欢迎你们的加入!

相关文章
相关标签/搜索