Yii2框架添加API Modules
原文链接:http://www.itnose.net/detail/6459353.html ;
一、环境部署
1. read fucking Yii Documents.
http://www.yiichina.com/doc/guide/2.0
2. 了解依赖注入模式
Java描述:
3. 使用advanced模板部署Yii2
https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-installation.md
# 一定要注意要执行init命令进行配置,只有执行了该命令,才会从environments目录下将dev或prod环境的配置信息和样例配置进入工程,才可以测试是否可用。
4. 测试样例是否能使用,不能使用从头检查。
二、模块配置
1. 在advanced目录下,创建api目录,将frontend或backend模块下所有文件复制过来
2. 配置api的别名,如果不配置这样,就需要设置很长的全名,容易出错还麻烦。
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 ;