【问题标题】:Access same url with different Controller and method for API使用不同的控制器和 API 方法访问相同的 url
【发布时间】:2018-07-18 04:50:02
【问题描述】:

我目前正在开发 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

【问题讨论】:

    标签: php laravel api url header


    【解决方案1】:

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

    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));
        }
    }
    

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

    //API 路由

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

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

    【讨论】:

    • 什么是$versionNameSpace,如何传递,是header值吗??
    • $versionNameSpace 是Api 文件夹中的文件夹名称。当您将 api-version 标头值添加到 1 时,控制器的命名空间将为 Api\v1
    • 检查 ApiVersion 类中的 $valid_api_versions 数组。如果你使用V1 代替v1 会更好
    • 我们可以通过检查web.php中的版本来实现$version = Request::header('api-version');并根据版本重定向到。这是正确的过程吗??
    • 重定向到哪里?您必须根据版本命名空间加载控制器。你试过我的答案了吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多