牛骨文教育服务平台(让学习变的简单)
博文笔记

Yii2框架添加API Modules

创建时间:2016-02-28 投稿人: 浏览次数:10767

一、环境部署

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

 

以上

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。