我的文件夹和代码结构为-
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) {
}
}
答案 0 :(得分:0)
通过您链接的docs:
这两种方法各有利弊,关于每种方法都有很多争论。下面您将看到一种实用的API版本控制策略,该策略是这两种方法的组合:
将API实现的每个主要版本放在一个单独的模块中,该模块的ID为主要版本号(例如v1,v2)。当然,API URL将包含主要版本号。
在每个主要版本中(因此在相应的模块中),使用Accept HTTP请求标头确定次要版本号,并编写条件代码以相应地响应次要版本。
主要api版本号由您在urlManager中设置的网址确定。您可以通过调用your-yii2-app.com/v1/controller/action
或your-yii2-app.com/v2/controller/action
来访问它们。解析标头的任何代码都必须由您编写:
接受HTTP请求标头来确定次要版本号,并编写条件代码以相应地响应次要版本。
如果要编写自定义api版本标头功能,则可以这样做。如果您遇到麻烦,建议您尝试创建一个新问题。