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层和事务进行已经深入的了解,祝大家天天开心~

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

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

  1. Android复习06【网络编程提高篇-安装GsonFormat、HttpUrlConnection封装、线程池、GsonFormat解析Json、自动加载下一页、自定义组件、页头页尾刷新、侧滑删除】

    2020-04-07 星期二 [第8周] [考试不考...] 目   录 思维导图 安装GsonFormat插件 添加网络访问权限 GitHub---HttpUrlConnection封装 线程池 G ...

  2. php入门篇-------PHPCMS 入口文件,自动加载系统函数和URL规则

    这里主要分析PHPCMS的入口文件和系统自动加载配置文件和系统函数,还有URL的规则: 首先是入口文件分析: index.php 2,框架主文件分析:(这里主要分析加载配置文件和公共函数,还有URL规 ...

  3. thinkphp源码分析(三)—自动加载篇(Loader的分析)

    源码分析 自动加载 系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载. 系统的自动加载由下面 ...

  4. Win8 x64 + Office Word 2013 x64 无法自动加载 Endnote X6 的解决方案

    此篇技术解决贴之前发布在PLOB上,阅读7700+,原文链接 https://www.plob.org/article/5932.html .最近新开了自己的CSDN博客,重发自己的原创作品. 问题描 ...

  5. log4j 源码解析_log4j1.x设置自动加载log4j.xml

    在没有设置自动加载log4j.xml的时候,一般我们需要这么处理 static void initLogger() {System.out.println("configurating lo ...

  6. thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

    ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能 ...

  7. composer php中如何执行,php中composer如何实现类的自动加载(示例讲解)

    本篇文章给大家带来的内容是关于php中composer如何实现类的自动加载(示例讲解),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们在开发项目中会经常用到第三方的类库插件,但是 ...

  8. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  9. php 实现自动加载更多,$.ajax+php实战教程之下拉时自动加载更多文章原理分析二...

    摘要: 继上一篇<$.ajax+php实战教程之下拉时自动加载更多文章原理分析>文章进行进一步讲解,完善之前的代码及引入ajax和php相关内容...... 上次留下的问题不知道看官们有没 ...

最新文章

  1. RPA与ERP之间的那些事儿,你都知道吗?
  2. 49 款人脸检测/识别的API、库和软件
  3. Leetcode题库 110.平衡二叉树(递归 C实现)
  4. h5新增 history的应用
  5. 清除WINDOW远程登录服务器的信息
  6. 《程序设计与数据结构》第3周学习总结
  7. Ubuntu学习日记--Lesson3:vim编辑器使用和常用命令
  8. leetcode------Flatten Binary Tree to Linked List
  9. 利用Expect实现telnet自动登录并执行command
  10. 关于Unity可视化编程工具bolt的基本使用和思考
  11. 读书笔记:高等代数 上册
  12. android edittext底线,android – 更改edittext的底线颜色
  13. 求一份 电力猫 QCA6410 原理图等
  14. 互联网+不是全民皆商
  15. 半导体器件基础07:三极管基础(3)
  16. 淘宝历史价格查询php源码,记录历史采购价并在列表中显示最低价
  17. 大二上课程设计作品(简单绘图板+桌面计算器+万年历)
  18. ElementUI 字体文件丢失
  19. 显控一体机选型_一种船用显控一体机的制作方法
  20. 计算机内存占用过高,内存占用过高怎么办

热门文章

  1. 原理优先的重要性_就signal探讨
  2. Oralce 导入dpm 文件数据
  3. ActiveMQ学习(四)——应用程序接口
  4. 《cmake practice》总结 | cmake的构建过程与基本指令
  5. 服务号php代码示例,php实现银联商务公众号+服务窗支付的示例代码
  6. (01)C++之设计模式演变
  7. c java 语法_java程序员要学的c语法
  8. mos管结电容等效模型_MOS管等效模型
  9. linux硬件开发学习,硬件学习该从何下手
  10. python代码编写_高质量Python代码编写的5个优化技巧