版本

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

准备

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

如何做…

  1. 在你的app文件夹中创建如下结构。总的来说,你需要创建@app/modules文件夹以及v1v2子文件夹。在每一个模块文件中,你需要创建控制器和模型文件夹:
  1. app/
  2. modules/
  3. v1/
  4. controllers/
  5. FilmController.php
  6. Module.php
  7. v2/
  8. controllers/
  9. FilmController.php
  10. Module.php
  1. 添加导入模块到@app/config/web.php
  1. 'modules' => [
  2. 'v1' => [
  3. 'class' => 'app\modules\v1\Module',
  4. ],
  5. 'v2' => [
  6. 'class' => 'app\modules\v2\Module'
  7. ]
  8. ],
  1. 使用如下代码创建@app/modules/v1/controllers/FilmController.php@app/modules/v2/controllers/FilmController.php
  1. <?php
  2. namespace app\modules\v1\controllers;
  3. use yii\rest\ActiveController;
  4. class FilmController extends ActiveController
  5. {
  6. public $modelClass = 'app\models\Film';
  7. }
  1. <?php
  2. namespace app\modules\v1\controllers;
  3. use yii\rest\ActiveController;
  4. class FilmController extends ActiveController
  5. {
  6. public $modelClass = 'app\models\Film';
  7. }

使用如下代码创建@app/modules/v1/Module.php@app/modules/v2/Module.php

  1. <?php
  2. namespace app\modules\v1;
  3. class Module extends \yii\base\Module
  4. {
  5. public function init()
  6. {
  7. parent::init();
  8. }
  9. }
  1. <?php
  2. namespace app\modules\v2;
  3. class Module extends \yii\base\Module
  4. {
  5. public function init()
  6. {
  7. parent::init();
  8. }
  9. }

工作原理…

每一个模块代表我们API中的一个独立的版本:

现在你将能以两种方式指定API版本:

  1. 通过API URL。你可以指定v1或者v2版本。结果是http://yiibook.app/v1/film返回版本1的电影列表,http://yiibook.app/v2/film将会返回版本2的电影列表。
  2. 你可以通过HTTP请求头指定一个版本号。通常来说,这可以通过Accept头来完成:
  1. // as a vendor content type
  2. Accept: application/vnd.company.myproject-v1+json
  3. // via a parameter
  4. Accept: application/json; version=v1

所以,现在我们有了两个版本的API,我们可以很容易的修改v2版本。我们的老客户继续使用v1版本,新用户或者愿意升级的用户可以使用v2版本。

更多…

欲了解更多信息,参考: