一、環境部署
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