天天看点

Yii2框架加入API Modules

一、环境部署

1. read fucking Yii Documents.

​​http://www.yiichina.com/doc/guide/2.0​​

2. 了解依赖注入模式

3. 使用advanced模板部署Yii2

​​https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-installation.md​​

# 一定要注意要运行init命令进行配置,仅仅有运行了该命令,才会从environments文件夹下将dev或prod环境的配置信息和例子配置进入project,才干够測试是否可用。

4. 測试例子能否使用。不能使用从头检查。

二、模块配置

1. 在advanced文件夹下,创建api文件夹,将frontend或backend模块下全部文件复制过来

2. 配置api的别名,假设不配置这样。就须要设置非常长的全名。easy出错还麻烦。

advanced/common/config/bootstrap.php修改成例如以下样子:

<?php
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');  \\ 新加入别名
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');      

3. 配置api模块里的main.php配置文件

<?php
$params = array_merge(
    require(__DIR__ . '/../../common/config/params.php'),
    require(__DIR__ . '/../../common/config/params-local.php'),
    require(__DIR__ . '/params.php'),
    require(__DIR__ . '/params-local.php')
);

return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'modules' => [  \\ 加入模块v1和v2,分别表示不同的版本号
        'v1' => [
            'class' => 'api\modules\v1\Module'
        ],
        'v2' => [
            'class' => 'api\modules\v2\Module'
        ]
    ],
    'controllerNamespace' => 'api\controllers',
    'components' => [
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => false, // API change to false
            'enableSession' => false,  // API ++
            'loginUrl' => null // API ++
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ?
 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
//         'urlManager' => [
//             'enablePrettyUrl' => true, // 启用美化URL
//             'enableStrictParsing' => true, // 是否运行严格的url解析
//             'showScriptName' => false, // 在URL路径中是否显示脚本入口文件
//             'rules' => [
//                  [
//                      'class' => 'yii\rest\UrlRule',
//                      'controller' => [
//                          'v1/site'
//                      ]
//                  ],
//                  [
//                      'class' => 'yii\rest\UrlRule',
//                      'controller' => [
//                          'v2/site'
//                      ]
//                  ]
//              ]
//         ],
    ],
    'params' => $params,
];      

# 该main.php文件在创建应用时作为配置项构造应用实例。

简而言之,让应用知道我们加入了两个模块:v1和v2

4. 依据main.php里修改知道,我们的模块路径为:api\modules\v1\Module,那就创建它吧。

    1> 在api文件夹下创建modules文件夹,在modules文件夹下创建v1文件夹。v2文件夹

    2> 在v1和v2文件夹下分别创建Module.php文件,内容例如以下:

<?php
namespace api\modules\v1;

class Module extends \yii\base\Module
{
    public $controllerNamespace = 'api\modules\v1\controllers';
    public function init()
    {
        parent::init();

        // ...  其它初始化代码 ...
    }
}
?>      

# 两处红色部分依据你是v1,还是v2分别不同。代码意思是。要通过依赖注入时要有这个类。没有这个类,在运行时会报:依赖注入找不到该类错误。

5. 完整Modules中的文件夹结构

在v1和v2文件夹下分别创建:controllers,models。views文件夹,这个不用多说了吧。MVC,MVC。

为了有个默认的接口返回信息。我们依照frontend的文件夹结构,在controllers文件夹下创建一个SiteController.php

<?php
namespace api\modules\v1\controllers;
use yii\rest\Controller;
class SiteController extends ActiveController
{
    public function actionIndex()
    {
           \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
           return [
               'message' => 'API test Ok!',
               'code' => 100,
           ];
    }
}


?>      

# 没什么好说的,就是返回JSON信息。

假设你实在不愿意使用SiteController.php,也就是说不想用site这个控制器ID。你能够在api/index.php中加入一行代码:

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../../common/config/main.php'),
    require(__DIR__ . '/../../common/config/main-local.php'),
    require(__DIR__ . '/../config/main.php'),
    require(__DIR__ . '/../config/main-local.php')
);

$application = new yii\web\Application($config);
$application->defaultRoute = 'v1/hello';
$application->run();      

然后在v1/controllers/下创建一个新的HelloController.php:

<?php
namespace api\modules\v1\controllers;
use yii\web\Controller;
class HelloController extends Controller
{
    public function actionIndex()
    {
           \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
           return [
               'message' => 'API test Ok!',
               'code' => 100,
           ];
    }
}

?>      

默认即可调用这个路由:v1/hello/index