下面由thinkphp框架教程欄目給大家介紹thinkphp5實現(xiàn)前后端分離,希望對需要的朋友有所幫助!
用Thinkphp5實現(xiàn)純API開發(fā)實現(xiàn)前后端分離
大致步驟如下
1.解決跨域請求問題
2.改變輸出數(shù)據(jù)格式為API常用返回JSON格式
3.自定義異常處理(修改適配API使用)
4.開始強制路由
解決跨域問題
找到 applicationtargs.php擴展定義文件,修改app_init的值
立即學習“PHP免費學習筆記(深入)”;
//?應用行為擴展定義文件 return?[ ????//?應用初始化 ????'app_init'?????=>?[ ????????'appapiCrossdomainCdom' ????], ????//?應用開始 ????'app_begin'????=>?[], ????//?模塊初始化 ????'module_init'??=>?[], ????//?操作開始執(zhí)行 ????'action_begin'?=>?[], ????//?視圖內(nèi)容過濾 ????'view_filter'??=>?[], ????//?日志寫入 ????'log_write'????=>?[], ????//?應用結(jié)束 ????'app_end'??????=>?[], ];
在application文件夾目錄下apiCrossdomain,在目錄下新建Cdom.php代碼文件,代碼如下
<?php namespace appapiCrossdomain; class Cdom { public function appInit($params) { //配置IP白名單 在測試環(huán)境下可以為 * 號 生產(chǎn)環(huán)境下建議根據(jù)實際環(huán)境進行修改。 header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Headers: token,Origin, X-Requested-With, X_Requested_With,Content-Type, Accept"); header('Access-Control-Allow-Methods: POST,GET,PUT'); if(request()->isOptions()){ ????????????exit(); ????????} ????} }
改變輸出數(shù)據(jù)格式為API常用返回JSON格式
TP5默認輸出數(shù)據(jù)格式為HTML,顯然不符合常用API接口的數(shù)據(jù)規(guī)范,在此我們需要做相應的修改。找到application目錄下的config.php修改如下配置已避免每次都需要手動 json或者json_encode
//?默認輸出類型 ????'default_return_type'????=>?'json',
修改后返回數(shù)據(jù)時可直接返回如下
??return?['code'=>1];
直接輸出json格式的數(shù)據(jù)
自定義異常處理(修改適配API使用)
TP5原有的異常處理機制如果做api接口的話會造成請求直接崩潰,在異常情況下API接口無法接收到正常的JSON數(shù)據(jù)而產(chǎn)生錯誤。為此我們需要自定義TP的異常處理機制。
找到application目錄下的config.php配置文件。修改如下選項為
'exception_handle' => 'appapiCrossdomainCdomHandle',
找到對應目錄,新增CdomHandle.php文件,添加如下代碼
<?php namespace appapiCrossdomain; use thinkexceptionHandle; use thinkEnv; use Exception; use MyCLabsEnumEnum; class CdomHandle extends Handle { private $code = 999; private $msg; private $errCode; private $errFile = ''; private $errline = ''; private $errtrace = ''; private $errtracestring = ''; protected function getSourceCode(Exception $exception) { // 讀取前9行和后9行 $line = $exception->getLine(); ????????$first?=?($line?-?9?>?0)???$line?-?9?:?1; ????????try?{ ????????????$contents?=?file($exception->getFile()); ????????????$source???=?[ ????????????????'first'??=>?$first, ????????????????'source'?=>?array_slice($contents,?$first?-?1,?19), ????????????]; ????????}?catch?(Exception?$e)?{ ????????????$source?=?['code'=>1]; ????????} ????????return?$source; ????} ????public?function?render(Exception?$e) ????{ ????????$app_debug?=?Env::get('APP_DEBUG'); ????????//如果是調(diào)試模式 ????????if($app_debug) ????????{ ????????????$this->msg?=?$e->getMessage(); ????????????$this->errCode?=?$e->getCode(); ????????????$this->errFile?=?json($this->getSourceCode($e)); ????????????$this->errline?=?$e->getLine(); ????????????if(Env::get('APP_TRACE')) ????????????{ ????????????????$this->errtrace?=?$e->getTrace(); ????????????????$this->errtracestring?=?$e->getTraceAsString(); ????????????} ????????} ????????else ????????{ ????????????$result?=?[ ????????????????'msg'?=>?$e->getMessage(), ????????????????'errFile'?=>?($this->getSourceCode($e)), ????????????????'code'?=>?999, ????????????]; ????????????return?json($result); ????????} ????????return?json([ ????????????'code'=>$this->code, ????????????'msg'=>$this->msg, ????????????'errCode'=>$this->errCode, ????????????'errFile'=>$this->errFile, ????????????'errLine'=>$this->errline, ????????????'errtrace'=>$this->errtrace, ????????????'errtracestring'=>$this->errtracestring ????????]); ????} }
開啟強路由
// 是否開啟路由 'url_route_on' => true, // 路由使用完整匹配 'route_complete_match' => true, // 是否強制使用路由 'url_route_must' => true,
這里的Env用法請參考TP手冊
BaseException說明:https://docs.python.org/3.1/library/exceptions.html#BaseException
相關(guān)推薦:最新的10個thinkphp視頻教程