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,总是有路通向罗马的。

目录
相关文章
|
2天前
|
SQL 关系型数据库 API
从API获取数据并将其插入到PostgreSQL数据库:步骤解析
使用Python处理从API获取的数据并插入到PostgreSQL数据库:安装`psycopg2`,建立数据库连接,确保DataFrame与表结构匹配,然后使用`to_sql`方法将数据插入到已存在的表中。注意数据准备、权限设置、性能优化和安全处理。
|
2月前
|
JSON 搜索推荐 API
【2024更新】如何使用google index api来自动提交url
本文提供了一个详细的指南,说明如何创建并使用使用google index api,google自动提交url来优化seo。
37 0
|
5月前
|
设计模式 Java API
使用Spring框架创建一个RESTful API,实现学生信息的管理,包括资源的创建、读取、更新和删除。
在当今的Web应用程序开发中,RESTful API(Representational State Transferful Application Programming Interface)变得越来越重要。Spring框架提供了强大的工具和功能,以便轻松创建、读取、更新和删除(CRUD)资源。在这篇文章中,我们将深入探讨如何使用Spring框架创建一个RESTful API,并通过一个完整的示例演示。
|
JSON 安全 Java
Eoapi x OpenDLP 插件上线:扫描 API 敏感字段,让你的 API 更安全
最近我们看到一个更严峻的趋势,越来越多的 API 导致了非常严重的数据泄露。数据泄露对企业来讲,尤其是大型企业,以及关系到民生或基础设施的企业,他们一次大范围的数据泄露是非常致命的,可能不仅仅是业务上损失,还会涉及到监管层面。
Eoapi x OpenDLP 插件上线:扫描 API 敏感字段,让你的 API 更安全
|
中间件 API PHP
【laravel项目】@4 微信授权登录 --dingo接管api路由之后,自定义路由(1)
【laravel项目】@4 微信授权登录 --dingo接管api路由之后,自定义路由
104 0
【laravel项目】@4 微信授权登录 --dingo接管api路由之后,自定义路由(1)
|
API PHP
【laravel项目】@4 微信授权登录 --dingo接管api路由之后,自定义路由(2)
【laravel项目】@4 微信授权登录 --dingo接管api路由之后,自定义路由
89 0
【laravel项目】@4 微信授权登录 --dingo接管api路由之后,自定义路由(2)
|
API PHP
【laravel】api路由无法访问
【laravel】api路由无法访问
489 0
【laravel】api路由无法访问
08配置基础路径 同时导出一个函数和一个变量 封装微信请求Api
08配置基础路径 同时导出一个函数和一个变量 封装微信请求Api
|
JSON Kubernetes Java
kubenetes: patch更新和替换、删除资源内容
kubenetes: patch更新和替换、删除资源内容
1135 0
kubenetes: patch更新和替换、删除资源内容
|
API 分布式数据库 开发者
判断表是否存在_旧 API|学习笔记
快速学习 判断表是否存在_旧 API
判断表是否存在_旧  API|学习笔记