1. 程式人生 > >yii2.0 高階版 restful api使用

yii2.0 高階版 restful api使用

1、複製任意個目錄(backend)為api 2、開啟api下的main.php 修改 id=>app-api,'controllerNamespace' => 'api\controllers', 'identityClass' => 'app\models\User'(使用者認證,暫無用),'errorAction' => 'exception/errorr',(修改錯誤處) ①在components裡新增URL規則 每新增一個方法必須在此註冊 'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true,//嚴格模式 'showScriptName' => false, 'suffix' => '.html', // 字尾,訪問方法的字尾 'rules' => [ [ 'class' => 'yii\rest\UrlRule', //'pluralize' => false, //設定為false 就可以去掉複數形式了,不然訪問控制器得加上s。 注意
'controller' => 'api', 'extraPatterns' => [ 'GET index' => 'index', 'POST,GET test' => 'test' ] ], ], ], ②自定義返回200,具體格式自己除錯 主要有正常返回資料,手動丟擲異常、系統異常 'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) { $response = $event->sender; if (isset($response->data['message'])){ $response->data = [ // 'success' => $response->isSuccessful, 'code' => isset($response->data['code'])?$response->data['code']:500, // 'message' => $response->statusText, 'info' => isset($response->data['message'])?$response->data['message']:'app error', ];   }   $response->statusCode = 200; }, ], 3、開啟common下的bootstrap.php 新增 Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
4、建立控制器繼承yii\rest\ActiveController。預設會有一些方法,在父類actions裡可以看到, 不需要時繼承後直接返回空就可以 5、定義一些行為,自動返回json、跨域等。 使用者登入我們是用的redis,所以認證沒整太明白 public function behaviors() { $behaviors = parent::behaviors(); // $behaviors['authenticator'] = [ // 'class' => CompositeAuth::className(), // 'authMethods' => // [ // # 下面是三種驗證access_token方式 // //HttpBasicAuth::className(), // //HttpBearerAuth::className(), // //這是GET引數驗證的方式 # http://10.10.10.252:600/user/index/index?access-token=xxxxxxxxxxxxxxxxxxxx // QueryParamAuth::className(), // ], // // 寫在optional裡的方法不需要token驗證 // 'optional' => [], // ];   // 這個是跨域配置 $behaviors['corsFilter'] = [ 'class' => Cors::className(), 'cors' => [ 'Origin' => ['*'], 'Access-Control-Request-Method' => ['POST', 'GET', 'DEL'], 'Access-Control-Request-Headers' => ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'], 'Access-Control-Allow-Origin' => ['*'], 'Access-Control-Allow-Credentials' => true, 'Access-Control-Max-Age' => 3600, 'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'], ], ]; #定義返回格式是:JSON $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON; return $behaviors; }   6、定義自己的錯誤,就是errorAction配置的方法
class ExceptionController extends \yii\web\Controller {   //錯誤處理 public function actionError() { $exception = \Yii::$app->errorHandler->exception; $code = $exception->statusCode ? $exception->statusCode : $exception->getCode(); //CommonController::response( $code ? $code : 400,$exception->getMessage());   return \Yii::createObject([ 'class' => 'yii\web\Response', 'format' => \yii\web\Response::FORMAT_JSON, 'data' => [ 'code' => $code, 'info' => $exception->getMessage() ], ]); } }   7、日誌設定 main 下面的components裡log。可以設定多個。 在控制器裡主要通過設定屬性來開啟關閉 \Yii::$app->log->targets['frontend']->enabled = true; \Yii::$app->log->targets['admin']->enabled = true; \Yii::warning($result,'frontend'); 該方法將手動寫入日誌 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'flushInterval' => 1, 'targets' => [ 'frontend' => [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], 'exportInterval' => 1, 'logFile' => '../logs/frontend/'.date('Ymd').'.log', 'logVars' => ['_POST','_GET'], //捕獲請求引數 'fileMode' => 0775, //設定日誌檔案許可權 'rotateByCopy' => false, //是否以複製的方式rotate 'prefix' => function() { //日誌格式自定義 回撥方法 if (Yii::$app === null) { return ''; } $controller = Yii::$app->controller->id; $action = Yii::$app->controller->action->id; return "[$controller-$action]\n"; }, ], 'admin' => [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning','info'], 'exportInterval' => 1, 'logFile' => '../logs/admin/'.date('Ymd').'.log', 'logVars' => ['_POST','_GET'], //捕獲請求引數 'fileMode' => 0775, //設定日誌檔案許可權 'rotateByCopy' => false, //是否以複製的方式rotate ], ], ], 8、多資料庫配置 在components 裡新增配置 預設的id 為db ①新增三個配置 $db = require(__DIR__ . '/db.php'); 'normal_ios' => $db['normal_ios'], 'normal_android' => $db['normal_android'], 'normal_web' => $db['normal_web'], ②使用的時候指定一個 \Yii::$app->normal_ios \Yii::$app->normal_android \Yii::$app->normal_web $this->find()->where($where)->one(\Yii::$app->normal_ios); \Yii::$app->normal_ios->createCommand() ->update($tab,$date,$where)->execute(); ③在視圖裡使用model模型的時候需要注意 重寫getDb方法,不然取欄位生成表單的時候會報錯找不到哪個db //防止構建表單是出錯 public static function getDb() { return \Yii::$app->normal_web }   9、設定session 'session' => [ 'cookieParams' => ['lifetime' => 3600*24],//有效時間 ],   10、nginx配置URL支援pathinfo location ~ \.php$ { #去掉$ root E:/phpStudy/WWW/tp/public/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; #增加這一句 fastcgi_param PATH_INFO $fastcgi_path_info; #增加這一句 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }