因為各種原因開始學習PHP,並且要在兩周內能夠對PHP項目進行二次開發,還好PHP夠簡單,至少入門很簡單,很快就接觸thinkPHP框架.
在了解了路由匹配視圖的規則之后,開始着手嘗試編寫API接口,期間由於沒有好好查看官方的命名規范文檔,導致出了些不必要的錯誤.
命名規范文檔: https://www.kancloud.cn/manual/thinkphp5/118007
目前發現的能夠輸出json數據的關鍵字有兩個:
return 返回數據
exit 返回並退出(結束進程)
開發前后端分離開發中,GET請求比較好處理,通過 $_GET變量可以直接拿到查詢字符串參數, 但是AJAX 的 請求體發送 json 數據不能通過 $_POST變量拿到, 據說該變量只能接受網頁方式傳遞的表單數據.
想拿到ajax 傳遞的 json數據可以通過
file_get_contents('php://input')
方式拿到,但是拿到的是字符串形式的json,需要解析:
json_decode(file_get_contents('php://input'))
PHP提供一個Json類可以直接響應json格式的數據, 也可以通過 exit(json)的方式來輸出json數據,只是exit執行之后會結束整個進程,這里需要注意.
另外由於exit函數接受的是字符串形式的參數,所以需要手動修改響應頭:
1 header('Content-Type:application/json; charset=utf-8'); 2 exit(json_encode(json);
所以我就可以寫一個基類了:
1 <?php 2 namespace app\commonBase\controller; 3 4 class BaseController 5 { 6 protected function responseJson($code=200, $msg="success", $data=[], $status=200) { 7 $resp = array('code'=>$code, 'msg'=>$msg, 'data'=>$data); 8 9 // 返回JSON數據格式到客戶端 包含狀態信息 10 header('Content-Type:application/json; charset=utf-8'); 11 return json($resp, $status); 12 } 13 14 // 解析 ajax 請求體數據 15 protected function ajaxJsonData() { 16 return json_decode(file_get_contents('php://input')); 17 } 18 19 // 獲取請求體數據 20 protected function bodyParams($key='') { 21 $body = $this->ajaxJsonData(); 22 if (isset($body[$key])) { 23 return $body[$key]; 24 } else { 25 return null; 26 } 27 } 28 29 // 解析查詢字符串數據 30 protected function queryParams($key='') { 31 if (isset($_GET[$key])) { 32 return $_GET[$key]; 33 } else { 34 return null; 35 } 36 } 37 }
可能是受Python的框架風格影響較深,總喜歡將后台業務代碼再進行細化, 具體的數據庫操作,請求數據解析,權限管理等邏輯進行分離, 方便管理和維護.
除了上面的問題之外,還有一個很詭異的問題,就是我的接口運行正常,也能正常響應,但是前端瀏覽器顯示狀態碼為 500;
找了下網上的資料,發現時日志寫入權限的問題,查看了下Apache運行日志:
問題出在這個位置:
第46行,如果路徑不是目錄,則創建目錄,目錄名什么的可以到源代碼里面去找:
把這個文件夾的寫入權限加上就可以了.
public/runtime文件夾