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

巧了我就是萌 提交于 2019-12-04 11:12:11

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

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

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

附上:

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

开源中国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 欢迎大家的加入!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!