版本
如果你的API没有版本是非常可怕的。假设你有一个重大改变——和客户端开发者的计划相违背,例如重命名或者删除一个参数,或者改变响应的格式——你将冒着破坏你顾客系统的风险,进而导致愤怒的支持电话或者更糟糕的客户流失。这就是为什么你需要保持你的API是版本化的。在Yii2中,版本可以很容易的通过模块来完成,所以版本被认为是孤立的一块代码。
准备
重复创建一个REST服务器小节中准备和如何做…的所有步骤。
如何做…
- 在你的app文件夹中创建如下结构。总的来说,你需要创建
@app/modules
文件夹以及v1
和v2
子文件夹。在每一个模块文件中,你需要创建控制器和模型文件夹:
app/
modules/
v1/
controllers/
FilmController.php
Module.php
v2/
controllers/
FilmController.php
Module.php
- 添加导入模块到
@app/config/web.php
:
'modules' => [
'v1' => [
'class' => 'app\modules\v1\Module',
],
'v2' => [
'class' => 'app\modules\v2\Module'
]
],
- 使用如下代码创建
@app/modules/v1/controllers/FilmController.php
和@app/modules/v2/controllers/FilmController.php
:
<?php
namespace app\modules\v1\controllers;
use yii\rest\ActiveController;
class FilmController extends ActiveController
{
public $modelClass = 'app\models\Film';
}
<?php
namespace app\modules\v1\controllers;
use yii\rest\ActiveController;
class FilmController extends ActiveController
{
public $modelClass = 'app\models\Film';
}
使用如下代码创建@app/modules/v1/Module.php
和@app/modules/v2/Module.php
:
<?php
namespace app\modules\v1;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
}
}
<?php
namespace app\modules\v2;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
}
}
工作原理…
每一个模块代表我们API中的一个独立的版本:
现在你将能以两种方式指定API版本:
- 通过API URL。你可以指定v1或者v2版本。结果是
http://yiibook.app/v1/film
返回版本1的电影列表,http://yiibook.app/v2/film
将会返回版本2的电影列表。 - 你可以通过HTTP请求头指定一个版本号。通常来说,这可以通过
Accept
头来完成:
// as a vendor content type
Accept: application/vnd.company.myproject-v1+json
// via a parameter
Accept: application/json; version=v1
所以,现在我们有了两个版本的API,我们可以很容易的修改v2版本。我们的老客户继续使用v1版本,新用户或者愿意升级的用户可以使用v2版本。
更多…
欲了解更多信息,参考: