View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

版本

如果你的API没有版本是非常可怕的。假设你有一个重大改变——和客户端开发者的计划相违背,例如重命名或者删除一个参数,或者改变响应的格式——你将冒着破坏你顾客系统的风险,进而导致愤怒的支持电话或者更糟糕的客户流失。这就是为什么你需要保持你的API是版本化的。在Yii2中,版本可以很容易的通过模块来完成,所以版本被认为是孤立的一块代码。

准备

重复创建一个REST服务器小节中准备如何做…的所有步骤。

如何做…

  1. 在你的app文件夹中创建如下结构。总的来说,你需要创建@app/modules文件夹以及v1v2子文件夹。在每一个模块文件中,你需要创建控制器和模型文件夹:
app/
    modules/
    v1/
        controllers/
            FilmController.php
        Module.php
    v2/
        controllers/
            FilmController.php
        Module.php
  1. 添加导入模块到@app/config/web.php
'modules' => [
    'v1' => [
        'class' => 'app\modules\v1\Module',
    ],
    'v2' => [
        'class' => 'app\modules\v2\Module'
    ]
],
  1. 使用如下代码创建@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版本:

  1. 通过API URL。你可以指定v1或者v2版本。结果是http://yiibook.app/v1/film返回版本1的电影列表,http://yiibook.app/v2/film将会返回版本2的电影列表。
  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版本。

更多…

欲了解更多信息,参考: