閱讀時長:10分鐘php
技術預備:ThinkPHP框架基礎用法html
童鞋們還記得一個URL請求的執行過程嗎?前端
沒錯,就是:路由->控制器->模型(->視圖)。數據庫
本章咱們主要講解ThinkPHP框架中的控制器的經常使用功能。json
在TP框架中定義控制器很是簡單,只須要在模塊下創建controller文件夾,在controller文件夾中定義一個PHP類文件便可,框架默認就自帶了Index控制器。後端
咱們在index模塊下定義一個HelloWorld控制器,並在其中增長base()方法。數組
接下來咱們訪問URL:安全
http://tp5.com/index/HelloWorld/base架構
會發現頁面報錯了,這是爲何呢?app
這是由於TP框架會將HelloWorld解析成Helloworld控制器類而不是HelloWorld控制器類,因此就致使了找不到當前訪問的控制器。
什麼?你不信?那咱們來打開框架的DEBUG模式看看,將config文件中的app_debug改成true。
而後咱們在訪問一次上面的URL
此次能夠看到,框架明確的提示了控制器不存在:app\index\controller\Helloworld
。
那實際須要怎麼訪問HelloWorld控制器呢?很簡單,將駝峯命名改成下劃線命名就能正常訪問了。
http://tp5.com/index/hello_world/base
在傳統的開發模式中,咱們訪問某一個URL時,後端就會使用MVC架構中的View層經過模版引擎來渲染一個HTML頁面。
這種時候咱們的URL返回的是一大串的文本。
可是如今流行的是先後端分離開發,也就是說後端只負責數據的處理,經過JSON的格式來輸入輸出數據,而前端就根據後端URL,也就是接口來獲取數據,並使用Vue、React之類的框架來渲染頁面。
那麼咱們的TP框架怎麼經過JSON格式返回接口數據呢?下面咱們就來舉一個小例子:
將HelloWorld控制器中的base方法改成返回一個數組,訪問URL:
http://tp5.com/index/hello_world/base
會發現框架報錯,報錯的內容是variable type error: array
。
這是由於框架默認只接收文本的返回值,而咱們此次返回的倒是一個PHP數組,致使框架返回內容時報了類型錯誤。
想要將返回值由文本改成JSON格式也很簡單,在config文件中,找到「default_return_type」一項,將本來的「html」改成「json」便可。
修改完畢後咱們使用Postman來訪問原來的接口。
能夠看到,成功的返回了數據而且轉爲了JSON格式。
使用控制器基類能夠有效的執行一些公共的操做(例如權限和登陸檢查)
。
下面咱們就用一個小Demo來演示一下:咱們假設訪問參數login=1時爲已登陸。
假如咱們每一個接口都須要判斷一下參數login,那豈不是重複的代碼一堆一堆的?這種時候就可使用控制器基類來實現公共操做。
在controller文件夾下建立Base類,並在其中添加__construct()方法。
那麼咱們怎們獲取URL中的參數呢?瞭解PHP基礎語法的童鞋確定知道,PHP會把請求的參數放在超全局變量$_GET
或$_POST
中。
可是直接從$_GET
中獲取參數是不安全的,會有被SQL注入的風險,在這裏能夠經過TP的助手函數request()獲取到通過處理的參數值。(其實即便是通過處理的參數值也仍是有SQL注入的風險,更保險的措施就是使用PDO來進行數據庫操做,後面的模型講解中將會提到)
後面的邏輯只須要輸入如下代碼,判斷login參數是否存在。
使用Base類也很是簡單,在HelloWorld中使用extends關鍵字繼承於Base類。
當咱們不傳login參數時訪問HelloWorld控制器中的base方法,就會拋出一個異常:
當咱們傳遞了login參數時,就能夠正常訪問了:
本章咱們學習瞭如何定義控制器,如何配置JSON返回格式,如何獲取URL中傳遞的參數,如何使用控制器基類。
控制器的功能大部分都是獲取參數,將參數傳遞到模型層、服務層,獲取返回的結果並返回。
其中獲取參數時還能夠依靠Validate類來進行參數校驗,在後面的課程中咱們會再來深刻講解控制器的其餘功能。
在上一章中,咱們的URL請求走到了exec()方法。
在App類的exec()方法中,有幾種執行的操做,而咱們請求的URL就符合 /模塊/控制器/操做 這種。
能夠看到,一個URL請求被框架路由類解析完後就進入到module()方法。
在module()方法中,會讀取不少咱們在config.php中的配置進行初始化操做,最後塞到invokeMethod()這個方法中執行。
而invokeMethod()方法就會調用bindParams()方法根據請求的類型從$_GET
和$_POST
變量中讀取參數並存放到單例的Request對象中。
最後調用PHP的反射機制,根據Route類解析出來的控制器類實例化一個控制器對象,並調用這個對象裏面的操做方法。
----- End -----
更多好文
請掃描下面二維碼
歡迎關注~