解析Thinkphp5怎么實現(xiàn)前后端分離

下面由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(&#39;Access-Control-Allow-Origin: *&#39;);         header("Access-Control-Allow-Headers: token,Origin, X-Requested-With, X_Requested_With,Content-Type, Accept");         header(&#39;Access-Control-Allow-Methods: POST,GET,PUT&#39;);         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'????=&gt;?'json',

修改后返回數(shù)據(jù)時可直接返回如下

??return?['code'=&gt;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 = &#39;&#39;;     private $errline = &#39;&#39;;     private $errtrace = &#39;&#39;;     private $errtracestring = &#39;&#39;;     protected function getSourceCode(Exception $exception)     {         // 讀取前9行和后9行         $line  = $exception->getLine(); ????????$first?=?($line?-?9?&gt;?0)???$line?-?9?:?1;  ????????try?{ ????????????$contents?=?file($exception-&gt;getFile()); ????????????$source???=?[ ????????????????'first'??=&gt;?$first, ????????????????'source'?=&gt;?array_slice($contents,?$first?-?1,?19), ????????????]; ????????}?catch?(Exception?$e)?{ ????????????$source?=?['code'=&gt;1]; ????????} ????????return?$source; ????} ????public?function?render(Exception?$e) ????{ ????????$app_debug?=?Env::get('APP_DEBUG'); ????????//如果是調(diào)試模式 ????????if($app_debug) ????????{ ????????????$this-&gt;msg?=?$e-&gt;getMessage(); ????????????$this-&gt;errCode?=?$e-&gt;getCode(); ????????????$this-&gt;errFile?=?json($this-&gt;getSourceCode($e)); ????????????$this-&gt;errline?=?$e-&gt;getLine(); ????????????if(Env::get('APP_TRACE')) ????????????{ ????????????????$this-&gt;errtrace?=?$e-&gt;getTrace(); ????????????????$this-&gt;errtracestring?=?$e-&gt;getTraceAsString(); ????????????} ????????} ????????else ????????{ ????????????$result?=?[ ????????????????'msg'?=&gt;?$e-&gt;getMessage(), ????????????????'errFile'?=&gt;?($this-&gt;getSourceCode($e)),  ????????????????'code'?=&gt;?999, ????????????]; ????????????return?json($result); ????????} ????????return?json([ ????????????'code'=&gt;$this-&gt;code, ????????????'msg'=&gt;$this-&gt;msg, ????????????'errCode'=&gt;$this-&gt;errCode, ????????????'errFile'=&gt;$this-&gt;errFile, ????????????'errLine'=&gt;$this-&gt;errline, ????????????'errtrace'=&gt;$this-&gt;errtrace, ????????????'errtracestring'=&gt;$this-&gt;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視頻教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享