首页 > 解决方案 > 使用不同的控制器和 API 方法访问相同的 url

问题描述

我目前正在使用 laravel 5.6 中的 API,我想对 v1 和 v2 等 API 进行版本控制。

我的问题是我想运行一个 URL 并访问两个 API 版本,我将版本号传递给 HEADER 并根据版本号访问 API 控制器。我也在使用中间件来检查版本号,但没有得到我需要的东西。

这是我的web.php

Route::post('/api/getticktes/{id}', 'Api\v1\TicketController@show')->middleware('checkHeaderV1');

标头 版本:- v1 版本:- v2

我的控制器目录是

Controller
 -Api
  --v1
  ---TicketController.php
  --v2
 ---TicketController.php

标签: phplaravelapiurlheader

解决方案


你可以使用这个类,我在我的旧项目中使用过它,可能不是有效的方法,但它会起作用

ApiVersion 类

namespace App\Http;

use Illuminate\Http\Request;

class ApiVersion
{
    protected static $valid_api_versions = [
        1 => 'v1',
        2 => 'v2'
    ];


    protected static function get($request)
    {
        $allApiVersions = array_keys(self::$valid_api_versions);
        $latestVersion = $allApiVersions[count($allApiVersions) - 1];
        $apiVersion = $request->header('api-version', $latestVersion);
        return in_array($apiVersion, $allApiVersions) ? $apiVersion : $latestVersion;
    }

    protected static function getNamespace($apiVersion)
    {
        return 'Api\\' . self::$valid_api_versions[$apiVersion];
    }

    public static function versionNamespace()
    {
       $request = Request::capture();
       return $apiNamespace = ApiVersion::getNamespace(self::get($request));
    }
}

现在在 api 路由文件中使用这个中间件namespace

//API 路由

$versionNameSpace = ApiVersion::versionNamespace();

Route::group(['middleware' => ['api'], 'namespace' => "{$versionNameSpace}"], function () {

});

添加api-version您的请求标头。该值应为 1 或 2 等


推荐阅读