使用不同的Controller和AP​​I方法访问相同的URL

时间:2018-07-18 04:50:02

标签: php laravel api url header

我目前正在使用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

1 个答案:

答案 0 :(得分:0)

您可以使用此类,我在我的旧项目中使用过,也许这不是有效的方法,但是它将起作用

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等