趙童鞋帶你入門PHP(八) ThinkPHP控制器篇

閱讀時長:10分鐘php

技術預備:ThinkPHP框架基礎用法html

童鞋們還記得一個URL請求的執行過程嗎?前端

沒錯,就是:路由->控制器->模型(->視圖)。數據庫

本章咱們主要講解ThinkPHP框架中的控制器的經常使用功能。json

1、定義控制器

在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

2、JSON返回格式

在傳統的開發模式中,咱們訪問某一個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格式。

3、控制器基類

使用控制器基類能夠有效的執行一些公共的操做(例如權限和登陸檢查)

下面咱們就用一個小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參數時,就能夠正常訪問了:

4、小結

本章咱們學習瞭如何定義控制器,如何配置JSON返回格式,如何獲取URL中傳遞的參數,如何使用控制器基類。

控制器的功能大部分都是獲取參數,將參數傳遞到模型層、服務層,獲取返回的結果並返回。

其中獲取參數時還能夠依靠Validate類來進行參數校驗,在後面的課程中咱們會再來深刻講解控制器的其餘功能。

5、控制器進階

在上一章中,咱們的URL請求走到了exec()方法。

在App類的exec()方法中,有幾種執行的操做,而咱們請求的URL就符合 /模塊/控制器/操做 這種。

能夠看到,一個URL請求被框架路由類解析完後就進入到module()方法。

在module()方法中,會讀取不少咱們在config.php中的配置進行初始化操做,最後塞到invokeMethod()這個方法中執行。

而invokeMethod()方法就會調用bindParams()方法根據請求的類型從$_GET$_POST變量中讀取參數並存放到單例的Request對象中。

最後調用PHP的反射機制,根據Route類解析出來的控制器類實例化一個控制器對象,並調用這個對象裏面的操做方法。

----- End -----

更多好文

請掃描下面二維碼

歡迎關注~

相關文章
相關標籤/搜索