先来看框架的入口函数:index.php

<?php
/*** 统一访问入口*/
require_once dirname(__FILE__) . '/init.php';
define('DS','/');
//$pai = new \PhalApi\PhalApi();
$pai = new \App\Common\MyPhalApi();
$pai->response()->output();

处理请求和响应的是response方法,这个方法的开头是这样的:

    public function response() {$di = \PhalApi\DI();error_reporting(E_ALL & ~E_NOTICE);set_error_handler(array(&$this,"customError"));// 开始响应接口请求$di->tracer->mark('PHALAPI_RESPONSE');$rs = $di->response;$isError = 0;$errorData = \PhalApi\DI()->requestInfo->get('errorData');try {// 接口调度与响应$api    = ApiFactory::generateService(); $action = $di->request->getServiceAction();$data   = call_user_func(array($api, $action));$rs->setData($data);} catch (Exception $ex) {.......}

要先从request请求中获取到用户想访问的类以及方法,我们先看类,也就是$api    = ApiFactory::generateService();这个方法:

    static function generateService($isInitialize = TRUE) {$di         = DI();$service    = $di->request->getService();$namespace  = $di->request->getNamespace();$api        = $di->request->getServiceApi();$action     = $di->request->getServiceAction();if (empty($api) || empty($action)) {throw new BadRequestException(T('service ({service}) illegal', array('service' => $service)));}$apiClass = '\\' . str_replace('_', '\\', $namespace) . '\\Api\\' . str_replace('_', '\\', ucfirst($api));if (!class_exists($apiClass)) {throw new BadRequestException(T('no such service as {service}', array('service' => $service)), 4);}$api = new $apiClass();if (!is_subclass_of($api, '\\PhalApi\\Api')) {throw new InternalServerErrorException(T('{class} should be subclass of \\PhalApi\\Api', array('class' => $apiClass)));}if (!method_exists($api, $action) || !is_callable(array($api, $action))) {throw new BadRequestException(T('no such service as {service}', array('service' => $service)), 4);}if ($isInitialize) {$api->init();}return $api;}

其实就是从request里去取出相关的类名称及方法名,然后进行一系列合法性判断.先看request的getService方法:

    /*** 获取接口服务名称** - 子类可重载此方法指定参数名称,以及默认接口服务* - 需要转换为原始的接口服务格式,即:Namespace.Class.Action* - 当命名空间为空时,默认使用App命名空间* - 为保持兼容性,子类需兼容父类的实现* - 参数名为:service,支持短参数名:s,并优先完全参数名** @return string 接口服务名称,如:Default.Index*/public function getService() {$service = $this->get('service', $this->get('s', 'App.Site.Index'));if (count(explode('.', $service)) == 2) {$service = 'App.' . $service;}return $service;}

就是通过地址栏取出相关参数.

request的构造方法里就先调用了getService方法:

    public function __construct($data = NULL) {// 主数据源$this->data     = $this->genData($data);// 备用数据源$this->get      = $_GET;$this->post     = $_POST;$this->request  = $_REQUEST;$this->cookie   = $_COOKIE;@list($this->namespace, $this->apiName, $this->actionName) = explode('.', $this->getService());}

当然安全起见我们不会把类名这些全部完整的通过url发来,比如我用?r=a表示?s=User.Weibo.Login?简单,直接在本地做个映射。比如我通过$_GET['r']获取到值为a,然后去一个自己配置的路由映射表里,取出a所对应的真实路径User.Weibo.Login.这样就达到效果了。修改后的getService方法如下:

    public function getService() {// 优先返回自定义格式的接口服务名称$service = $this->get('r');$service = trim($service);if($service) {//下面要换成redis缓存//$service = \PhalApi\DI()->config->get('rules.'.$service);$rulesData = \app\MDC()->PublicObj->rulesCache();$service = $rulesData[$service];}if (!empty($service)) {$namespace = count(explode('.', $service)) == 2 ? 'App.' : '';return $namespace . $service;          }return parent::getService();} $rulesData里就是去自己配置的映射表里取出对应的真实请求类以及方法.

当然,一般不修改框架源码,这个方法我是自己写了一个扩展子类,然后去di.php把request类注册成自己扩展的类,如下:

 $di->request = new App\Common\Request();

3.路由实现(phalapi框架总结)相关推荐

  1. php api 无符号整数基数为16的整数参数的字符串表示形式,[1.12]-参数规则:接口参数规则配置 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    "播下一种思想,收获一种行为:播下一种行为,收获一种习惯:播下一种习惯,收获一种性格:播下一种性格,收获一种命运." --<成君忆:水煮三国> 1.12.1 参数解析 ...

  2. php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    1.23.1 请求 把我们后台的API想象成一个函数,那么请求的参数就是我们的参数列表:而接口响应的数据则对应函数返回的结果. 对于请求,正如前面所看到的,我们可以使用$_GET,也可以使用$_POS ...

  3. phalapi 数据库锁_[7.11]-phalapi-进阶篇5(数据库读写分离) | PhalApi(π框架) - PHP轻量级开源接口框架...

    phalapi-进阶篇5(数据库读写分离以及多库使用) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 读写分离是我们常用的一种解决方案,它可以解决大 ...

  4. phalapi可以依赖注入么_[7.8]-phalapi-进阶篇2(DI依赖注入和单例模式) | PhalApi(π框架) - PHP轻量级开源接口框架...

    phalapi-进阶篇2(DI依赖注入和单例模式) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 离上一次更新过去了快两周,在其中编写了一个关于DB ...

  5. PHP学习笔记——在phalapi框架内的orm数据库操作

    今天将自己的聚合支付接口集成到了phal框架内,由于在phalapi框架内如何返回视图不知道,因此需要将原本的wap站点的sdk包转化为api资源.具体过程稍晚点记录,现在将phalapi框架内的数据 ...

  6. 框架 路由地址_Django框架的使用

    Django框架的使用 一,创建基本项目 创建项目 # web是项目名称或者称为项目目录django-admin startproject web​# 会在执行命令的当前目录中 创建 web项目目录w ...

  7. php调用好单库api视频教程,[8.1]-PhalApi视频教程 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    [8.1] PhalApi视频教程 先在这里感谢以下录制小组的同学,是你们让世界看到PhalApi的视频教程! A西瓜妹子.听风不语.彩色的雨.Catch.喵了个咪.dogstar PhalApi教程 ...

  8. php mvc 路由,PHP MVC框架路由学习笔记

    文章主要介绍了PHP MVC框架路由学习笔记的相关资料,需要的朋友可以参考下. 提到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来 ...

  9. 对比原生Node封装的Express路由 和 express框架路由

    文章目录 前言 一.routes.js 1.引入模块 2.changesRes() - send() 3.getFileMime() - type() 4.initStatic 5.server() ...

  10. 如何深入理解PhalApi框架三层结构Api+Domain+Model模式

    1. Api+Domain+Model 其实这样的三层结构和java中的web+service+dao比较像,和我们平常所说的MVC开发模式也是非常想象.只是说web和api一个进行页面显示一个不进行 ...

最新文章

  1. Ucenter会员同步通讯登录原理(转)
  2. K8S集群Master高可用实践
  3. java布尔类型的调用_【Java学习笔记之八】JavaBean中布尔类型使用注意事项
  4. PTA甲级15进制转换
  5. maven错误相关(整理中)
  6. c# rar解压大小_C#中使用WinRAR实现加密压缩及解压缩文件
  7. stm32 c语言 位带,我对STM32所用位带操作宏的超详细剖析、优势分析及应用推广探索研究(持续更新,欢迎讨论交流)...
  8. 显微镜自动聚焦原理是什么_激光共聚焦显微镜系统的原理和应用讲解
  9. word2016 无响应问题解决办法
  10. 网络访问计算机无法访问,无法访问,您可能没有权限使用网络资源的解决方法...
  11. 免费 GIS 软件资源介绍,大家值得收藏
  12. 新版Win10开机任务栏卡死的原因和解决方法
  13. 【Android应用开发之前端——简易App登录页面】
  14. Linux基础复习总结
  15. LeetCode(70题)--爬楼梯[JAVA]
  16. 抖音直播带货数据复盘怎么做?如何复盘提高直播间转化率?
  17. 探针台选型的注意事项有哪些
  18. 【红宝书笔记精简版】第十二章 BOM
  19. git commit -m XX报错 pre -commit hook failed (add --no-verify to bypass)问题
  20. linux中病毒排查步骤,linux系统下病毒排除思路

热门文章

  1. linux 中xls格式的文件,如何在命令行中将XLS文件转换为CSV [Linux] | MOS86
  2. 基于maven自动构建和部署工具-JDeploy
  3. 小米编程真题:风口的猪-中国牛市
  4. iOS进阶 - GCD总结
  5. 2022云管云网大会丨阿里云孙成浩:构建万物互联的智能云网络
  6. 认知升级:从首席架构师到CTO
  7. 个人微信支付宝接入GOGO支付免签系统详细教程(图文)
  8. MySQL int(M)数值类型中M值的意义
  9. 杀毒软件已经进入空前弱智与混沌状态
  10. 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day7)