当前位置: 首页 > 编程日记 > 正文

l5如何通过路由走api版本回退查找设置

l5如何通过路由走api版本回退查找设置

具体需求

当前遇到的问题是使用laravel写接口,但是接口是有版本号的,我们把版本号放在url中,比如:

http://yejianfeng.com/api/user/info/?uid=1
http://yejianfeng.com/api1.1/user/info/?uid=1
http://yejianfeng.com/api1.2/user/info/?uid=1

但是实际上api1.1的user/info和api的user/info的action是一样的,但是api1.2的user/info是不一样的

本来路由应该这么写:

<?php
Route::group(array('prefix' => 'api'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo']);
});Route::group(array('prefix' => 'api1.1'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo']);
});Route::group(array('prefix' => 'api1.2'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo1_2']);
});

这个感觉还是丑了点,我不希望路由会这么复杂,我希望的是进行版本衰退寻找,api1.1中的user/info那个不需要写,它能自动去寻找api1.1中有没有这个路由,没有的话,去寻找比它版本低的路由。

解决方法

这里当然要使用到middleware,希望路由是:

<?php
Route::group(array('prefix' => 'api'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo']);
});Route::group(array('prefix' => 'api1.1', 'middleware' => 'downgrade'), function() {
});Route::group(array('prefix' => 'api1.2', 'middleware' => 'downgrade'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo1_2']);
});

但是非常可惜,这样写的话

http://yejianfeng.com/api1.1/user/info/?uid=1

是进不了middleware的。

我们需要的是有个“匹配所有”的路由能将路由定位定到prefix 1.1的这个里面

所以改成这样:

<?php
Route::group(array('prefix' => 'api'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo']);
});Route::group(array('prefix' => 'api1.1', 'middleware' => 'downgrade'), function() {Route::any('/{c}/{a}', function(){});
});Route::group(array('prefix' => 'api1.2', 'middleware' => 'downgrade'), function() {Route::get('/user/info', ['uses' => 'UserController@userinfo1_2']);Route::any('/{c}/{a}', function(){});
});

这里就能将所有的/{version}/{controller}/{action}这样的请求经过downgrade中间件了。

但是中间件怎么写呢?

downgrade中间件的编写

<?php namespace App\Http\Middleware;use Closure;
use Illuminate\Contracts\Routing\Middleware;class DownGradeMiddleware implements Middleware {public function handle($request, Closure $next){$routeAction = $request->route()->getAction();$routes = \Route::getRoutes()->getRoutes();$requestUri = $_SERVER['REQUEST_URI'];$querys = explode('?', $requestUri);$queryPath = trim($querys[0], '/');$querySecs = explode('/', $queryPath);// 没有对应的,进行api版本回找$versions = ['api', 'api1.1', 'api1.2'];$apiversion = $querySecs[0];$key = array_search($apiversion, $versions);while (1) {if ($key < 0) {break;}$querySecs[0] = $versions[$key];$queryPath = trim(implode('/', $querySecs), '/');foreach ($routes as $route) {if ($route->getUri() == $queryPath) {$action = $route->getAction();$routeAction['uses'] = $action['uses'];$request->route()->setAction($routeAction);return $next($request);}}$key--;}$response = $next($request);return $response;}
}

这里最重要的点就是将$routeAction的uses字段修改之后,调用

$request->route()->setAction($routeAction);

就可以修改路由对应的action了

其他的就是业务逻辑的问题了。

至于如何挂载middleware,可以参考laravel文档:路由进行挂载

总结

laravel4把匹配全路由的函数去掉了,但是其实使用中间件+any("{a}/{b}/{c}") 的方法也可以近似实现一个这样的功能的。

so,总是有路通向罗马的。

相关文章:

jspf插件框架

简介&#xff1a;jspf (Java Simple Plugin Framework) 是一个插件框架&#xff0c;用于减少小型项目的的开发时间&#xff0c;增加代码的可维护性。他完全隐藏了组件的详细实现&#xff0c;只用到他们的接口。加载组件所需要的代码也很少&#xff0c;便于编写。jspf框架完全基…

list控件响应鼠标键的单双击

前面一片博客磁盘文件目录罗列和list控件的使用 写过关于list控件的一点使用方法。这篇博客接着继续讲list控件&#xff0c;当我把某个磁盘下的文件目录列出来显示在list控件中&#xff0c;我们肯定是想要对这些目录进行一些操作&#xff0c;比如新建文件夹、删除文件等操作。那…

我佛了!用KNN实现验证码识别,又 Get 到一招!

作者| 李秋键责编| Carol出品| AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;头图 | CSDN付费下载自视觉中国验证码使我们生活中最为常见的防治爬虫和机器人登录攻击的手段&#xff0c;一般的验证码主要由数字和字母组成&#xff0c;故我们可以设想&#xff1a…

JVM中的垃圾收集器

2019独角兽企业重金招聘Python工程师标准>>> Serial收集器: 一种新生代的单线程收集器&#xff0c;采用复制算法回收。当它进行垃圾收集时&#xff0c;其他用户的所有线程都将暂停。 Serial Old收集器&#xff1a;Serial的老年代版本&#xff0c;采用的是标记-清除算…

linux系统用户,组和权限的管理

PS&#xff1a; {最近一直在做毕业设计&#xff0c;前面博客也记录过我的一些过程。其中需要在Ubuntu上搭建一个FTP服务器&#xff0c;此处我选择Vsftpd&#xff0c;但是在我对vsftpd的配置文件vsftpd.conf设置正确后&#xff08;对于上传&#xff0c;下载等设置肯定没问题&am…

520 情人节 :属于Python 程序员的脱单攻略大合集(视频版)

作者| Python 编程时光责编| Carol情人节年年有&#xff0c;但今年的 5.20 要比以往的更有意义。2020.05.20 &#xff0c;爱你爱你我爱你&#xff0c;如果再卡个时间&#xff08;13:14&#xff09;&#xff0c;那就是 爱你爱你我爱你一生一世。为了能过上这个这个百年难遇的情人…

使用Word2010灵活掌握文档结构

使用Microsoft Word应用程序组织和编写文档时&#xff0c;可能会出现反复调整文档结构的情况&#xff0c;而通过一系列的剪切、复制、粘贴操作来解决问题&#xff0c;可能会让您觉得很麻烦&#xff0c;有没有更好的解决办法呢&#xff1f;其实&#xff0c;通过使用Word 2010中全…

深入Jetty源码之HTTP协议

在计算机网络中&#xff0c;如果两台机器要通信&#xff0c;他们首先要定义通信数据的格式&#xff0c;这样在服务器收到客户端的请求消息时&#xff0c;它才能正确的解析请求的内容&#xff0c;然后根据请求内容处理逻辑&#xff0c;并将相应消息传递会客户端&#xff1b;此时…

64位win7安装vs2010出现“组件安装失败...”等问题的解决方法

如题&#xff0c;公司发了新电脑&#xff0c;安装的是64位win7 ,我原来的本本安装的是32位的win7&#xff0c;当时安装vs2010的时候并没有那么多事&#xff0c;这次安装却真是让我蛋疼至极。 先后下了3个vs的安装包&#xff0c;中文版的&#xff0c;有专业版的&#xff0c;有旗…

不同网段路由配置

PC1 ip 192.168.1.1PC2 ip 192.168.4.1路由0 f0/0 192.168.1.254 f0/1 192.168.2.1路由1 f0/0 192.168.3.1f0/1 192.168.2.2路由2 f0/0 192.168.4.254 f0/1 192.168.3.2路由器0Router>enRouter#conf tRouter(config)#no ip domain-lookupRouter(config)#line console 0…

黑科技:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!

来源 | 学术头条&#xff08;ID:SciTouTiao&#xff09;头图 | CSDN付费下载自视觉中国对于全球 5000 多万盲人来说&#xff0c;重见光明是一个遥不可及的梦想。而为了与盲人朋友进行交互&#xff0c;我们发明了盲文&#xff0c;用各种凸起的字符集合来表达各种意思。但这种通过…

Solr 4.x定时、实时增量索引 - 修改、删除和新增索引

2019独角兽企业重金招聘Python工程师标准>>> 一、开始增量索引前的准备工作。 1、认识data-config.xml中相关属性 <!-- transformer 格式转化&#xff1a;HTMLStripTransforme表示 索引中将忽略HTML标签 ---> <!-- query: 查询数据库表符合记录数据 …

关于Blocking IO, Non-Blocking IO 和 Asynchronous I/O的理解

文章写得很详细很清楚了&#xff0c;对我的理解帮助很大。 转载自&#xff1a;http://www.cnblogs.com/whyandinside/archive/2012/03/04/2379234.html。 概括来说&#xff0c;一个IO操作可以分为两个部分&#xff1a;发出请求、结果完成。如果从发出请求到结果返回&#xff…

还在苦恼机器学习和线性回归?这篇总结拿走不谢 | 原力计划

作者 | 听星的朗瑞责编 | 王晓曼出品 | CSDN博客题图 | 东方IC什么是机器学习&#xff1f;机器学习是一种实现人工智能的方法&#xff0c;从数据中寻找规律、建立关系&#xff0c;根据建立的关系去解决问题&#xff0c;从数据中进行经验学习&#xff0c;实现自我优化与升级。维…

网页设计和用户界面设计

摘要&#xff1a;这是两个现在网页设计领域使用频率非常高的词。在大多数情况下&#xff0c;它们被相互替代。这个领域内外的很多人都认为这是两个意义基本一样的词。但是它们真的可以互相混淆么&#xff1f;这是两个现在网页设计领域使用频率非常高的词。在大多数情况下&#…

使用VisualStudio2010连接CodePlex进行代码管理

摘要&#xff1a;CodePlex是微软的开源工程网站&#xff0c;涉及诸多微软最新技术的开源工程&#xff0c;同时你也可以建立并向世界展示自己的开源工程。同SourceForge、GoogleCode相比CodePlex有其自身的优势&#xff0c;特别是对做.Net开发的朋友来说&#xff0c;由于CodePle…

计算程序运行时间(time_t, clock_t)

转载自&#xff1a;http://blog.chinaunix.net/uid-23208702-id-75182.html 计算程序运行时间&#xff08;time_t, clock_t&#xff09;-whyliyi-ChinaUnix博客 我们有时需要得到程序的运行时间&#xff0c;但我们也要知道&#xff0c;根本不可能精确测量某一个程序运行的确切…

又一年5.20,用Python助力程序员脱单大攻略(视频版)

作者 | 写代码的明哥来源 | Python编程时光&#xff08;ID: Cool-Python&#xff09;情人节年年有&#xff0c;但今年的 5.20 要比以往的更有意义。2020.05.20 &#xff0c;爱你爱你我爱你&#xff0c;如果再卡个时间&#xff08;13:14&#xff09;&#xff0c;那就是 爱你爱你…

pthred()多线程计算派

实验一&#xff1a;计算π问题描述实验提供了两种计算方法&#xff0c;一种使用积分方法&#xff0c;另一种采用随机数方法。本报告中采用积分方法。计算公式&#xff1a;程序流程图&#xff1a;(图1)函数流程图(图2)一组实验数据&#xff0c;计算规模&#xff1a;500,000,000性…

使用最小堆优化Dijkstra算法

OJ5.2很简单&#xff0c;使用priority_queue实现了最小堆竟然都过了OJ……每次遇到relax的问题时都简单粗暴地重新push进一个节点…… 然而正确的实现应该是下面这样的吧&#xff0c;关键在于swap堆中元素时使用pos数组存储改变位置后的编号为k的节点对应在堆中的位置。下面这种…

C语言编程技巧-signal(信号机制)

http://blog.sina.com.cn/s/blog_6a1837e90100v1vc.html

第一课:网络参考模型OSI

网络参考模型OSI(一)&#xff1a;模型提出目的&#xff1a;开放系统互连。使各个厂商的设备可以很好的互连、互通、互操作。(二)&#xff1a;各层功能(1):物理层&#xff1a;负责链路上bit流的传输。&#xff08;bit流显著的特点是&#xff0c;不支持格式或者结构&#xff09;。…

在线直播 | 是事实还是贩卖焦虑?IT行业也偏爱“小鲜肉”​

几年前曾看过这样一篇报道&#xff1a;Java 之父求职被嫌年纪大&#xff0c;硅谷公司现在喜欢“小鲜肉”&#xff0c;不爱“老古董”。Java之父 James Gosling 在 Facebook 上发表了他所遭遇的年龄歧视&#xff1a;我曾在面试的时候被 HR 告知&#xff0c;“通常我们不招你这种…

eclipse 代码中突然出现特殊字符

在写代码的时候&#xff0c;不知道点到了 eclipse 的哪个属性&#xff0c;代码中就出现了一些特殊字符&#xff0c;也不能删除。 请问&#xff0c;在 eclipse 中该怎么设置&#xff0c;才能将这些字符去掉。 如下图所示&#xff1a; 解决方法: 选择Window->Preferences->…

如何优化数据中心虚拟机布局

当前已经有很多组织将服务器虚拟化技术引入到生产中&#xff0c;这么做是有道理的&#xff0c;特别是在当前经济并不景气的情况下&#xff0c;因为服务器虚拟化技术可以在服务器硬件&#xff0c;机架空间&#xff0c;电力消耗和制冷方面为组织节省开支。   但为了实现服务器虚…

回归——同步更新github.io

回归 已经有好长时间没写博客了&#xff0c;可能我比较懒&#xff0c;不太乐于分享&#xff0c;我觉得这个是一个很不好的习惯。但我坚信&#xff1a;Sharing changes the world! 最近搭建了自己的个人独立博客&#xff0c;基于Github Pages的&#xff0c;所以打算以后同步更…

支持量子机器学习,王海峰发布最新百度飞桨全景图

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;刚刚&#xff0c;WAVE SUMMIT 2020深度学习开发者峰会上&#xff0c;百度CTO王海峰开场即披露了一组飞桨数据&#xff1a;飞桨累计开发者数量已超过190万&#xff0c;服务企业数量达8.4万家&#xff0c;发布模型数量已…

NPOI读写Excel

1、整个Excel表格叫做工作表&#xff1a;WorkBook&#xff08;工作薄&#xff09;&#xff0c;包含的叫页&#xff08;工作表&#xff09;&#xff1a;Sheet&#xff1b;行&#xff1a;Row&#xff1b;单元格Cell。 2、NPOI是POI的C#版本&#xff0c;NPOI的行和列的index都是从…

我的vim捣鼓之路

2016-06-13 更新 绑定独立博客到域名rebootcat.com 2016-06-12 更新文中的几个链接错误&#xff0c;google search报错 前言 从大二的时候就开始接触Linux了&#xff0c;从而也接触了vi,对的&#xff0c;当时对这些还不太了解&#xff0c;不知道还有个vim&#xff0c;真的觉得…

代码写对了还挂了?程序媛小姐姐从 LRU Cache 带你看面试的本质

来源 | 码农田小齐责编 | Carol 前言在讲这道题之前&#xff0c;我想先聊聊「技术面试究竟是在考什么」这个问题。技术面试究竟在考什么在人人都知道刷题的今天&#xff0c;面试官也都知道大家会刷题准备面试&#xff0c;代码大家都会写&#xff0c;那面试为什么还在考这些题&…