Yii2框架添加API Modules
一、环境部署
1. read fucking Yii Documents.
http://www.yiichina.com/doc/guide/2.0
2. 了解依赖注入模式
Java描述:
http://blog.csdn.net/taijianyu/article/details/2338311/
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" => "apimodulesv1Module"
],
"v2" => [
"class" => "apimodulesv2Module"
]
],
"controllerNamespace" => "apicontrollers",
"components" => [
"user" => [
"identityClass" => "commonmodelsUser",
"enableAutoLogin" => false, // API change to false
"enableSession" => false, // API ++
"loginUrl" => null // API ++
],
"log" => [
"traceLevel" => YII_DEBUG ? 3 : 0,
"targets" => [
[
"class" => "yiilogFileTarget",
"levels" => ["error", "warning"],
],
],
],
"errorHandler" => [
"errorAction" => "site/error",
],
// "urlManager" => [
// "enablePrettyUrl" => true, // 启用美化URL
// "enableStrictParsing" => true, // 是否执行严格的url解析
// "showScriptName" => false, // 在URL路径中是否显示脚本入口文件
// "rules" => [
// [
// "class" => "yii
estUrlRule",
// "controller" => [
// "v1/site"
// ]
// ],
// [
// "class" => "yii
estUrlRule",
// "controller" => [
// "v2/site"
// ]
// ]
// ]
// ],
],
"params" => $params,
];
# 该main.php文件在创建应用时作为配置项构造应用实例。简而言之,让应用知道我们添加了两个模块:v1和v2
4. 根据main.php里改动知道,我们的模块路径为:apimodulesv1Module,那就创建它吧。
1> 在api目录下创建modules目录,在modules目录下创建v1目录,v2目录
2> 在v1和v2目录下分别创建Module.php文件,内容如下:
<?php
namespace apimodulesv1;
class Module extends yiiaseModule
{
public $controllerNamespace = "apimodulesv1controllers";
public function init()
{
parent::init();
// ... 其他初始化代码 ...
}
}
?># 两处红色部分根据你是v1,还是v2分别不同。代码意思是,要通过依赖注入时要有这个类,没有这个类,在运行时会报:依赖注入找不到该类错误。5. 完整Modules中的目录结构
在v1和v2目录下分别创建:controllers,models,views目录,这个不用多说了吧。MVC,MVC。
为了有个默认的接口返回信息,我们按照frontend的目录结构,在controllers目录下创建一个SiteController.php
<?php
namespace apimodulesv1controllers;
use yii
estController;
class SiteController extends ActiveController
{
public function actionIndex()
{
Yii::$app->response->format = yiiwebResponse::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 = yiihelpersArrayHelper::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 yiiwebApplication($config);
$application->defaultRoute = "v1/hello";
$application->run();
然后在v1/controllers/下创建一个新的HelloController.php:
<?php
namespace apimodulesv1controllers;
use yiiwebController;
class HelloController extends Controller
{
public function actionIndex()
{
Yii::$app->response->format = yiiwebResponse::FORMAT_JSON;
return [
"message" => "API test Ok!",
"code" => 100,
];
}
}
?>默认就行调用这个路由:v1/hello/index
以上
