为什么yiii2 rest api版本不起作用?

时间:2018-08-30 07:57:20

标签: php yii2 yii2-advanced-app

我的文件夹和代码结构为-

api/
    modules/
        v1/
            controllers/
                UserController.php
                BaseController.php
            Module.php
        v2/
            controllers/
                UserController.php
                BaseController.php
            Module.php

我的应用程序配置如下:

'modules' => [
        'v1' => [
            'basePath' => '@app/modules/v1',
            'class' => 'api\modules\v1\Module'
        ],
         'v2' => [
            'basePath' => '@app/modules/v2',
            'class' => 'api\modules\v2\Module'
        ],
     ],
'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => false,
            'showScriptName' => false,
            'rules' => [

                    ['class' => 'yii\rest\UrlRule', 'controller' => ['v2/user']],
                    ['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user']],
],
]

我遵循与yii2 doc相同的程序,但是其版本无效。

更新: 我创建了一个服装规则并据此进行解析。寻找其他东西。

    class ApiUrlRule implements UrlRuleInterface {

    public function parseRequest($manager, $request) {
        $pathInfo = $request->getPathInfo();
        $paramas=$request->getQueryParams();


        $version=Yii::$app->response->acceptParams['version'];
        $route = Yii::$app->response->acceptParams['version'].'/'.$pathInfo;
         return [$route,$paramas];
    }

public function createUrl($manager, $route, $params) {

}


}

1 个答案:

答案 0 :(得分:0)

通过您链接的docs

  

这两种方法各有利弊,关于每种方法都有很多争论。下面您将看到一种实用的API版本控制策略,该策略是这两种方法的组合:

     
      
  • 将API实现的每个主要版本放在一个单独的模块中,该模块的ID为主要版本号(例如v1,v2)。当然,API URL将包含主要版本号。

  •   
  • 在每个主要版本中(因此在相应的模块中),使用Accept HTTP请求标头确定次要版本号,并编写条件代码以相应地响应次要版本。

  •   

主要api版本号由您在urlManager中设置的网址确定。您可以通过调用your-yii2-app.com/v1/controller/actionyour-yii2-app.com/v2/controller/action来访问它们。解析标头的任何代码都必须由您编写:

  

接受HTTP请求标头来确定次要版本号,并编写条件代码以相应地响应次要版本。

如果要编写自定义api版本标头功能,则可以这样做。如果您遇到麻烦,建议您尝试创建一个新问题。