閱讀時長:10分鐘php
技術預備:ThinkPHP框架基礎用法程序員
上一章咱們簡單介紹了MVC框架的三大件:控制器、模型、視圖,以及路由。thinkphp
童鞋們還記得一個URL請求的執行過程嗎?設計模式
沒錯,就是:路由->控制器->模型(->視圖)。數組
這章咱們仍是按照趙童鞋一向的風格,省略掉80%比較少用的功能,講解一下TP5中路由的經常使用操做。緩存
上一章中,咱們在Index控制器中新增了hello()方法,經過訪問URL:app
就能夠訪問到hello()方法裏的代碼。(童鞋們記得課前先配置虛擬域名哦~)
學習
這裏就出現了一個問題,URL也太太太長了。測試
「懶惰的程序員們」想到了一個好辦法去解決:定義一個短的URL去代替長的URL,也就是定義路由規則。
在TP5中定義應用的路由規則,直接在application/route.php文件中添加路由規則便可。
咱們就定義一個hello路由到上面提到的index/index/hello操做。
框架爲咱們提供了兩種定義方式。
靜態註冊:
動態註冊:
靜態註冊和動態註冊的規律是同樣的:第一個參數稱爲路由規則(經過路由訪問的地址)
,第二個參數爲該規則對應的路由地址(也就是原來定義路由以前訪問的URL地址)
趙童鞋推薦使用動態註冊,動態註冊是TP官方推薦的作法,同時也是Laravel等其餘框架比較通用的作法,畢竟咱們雖然學習了TP框架,但工做時並不必定會使用上,學會其中通用的部分最實際。
路由規則定義好以後,嘗試訪問URL:
若是不出意外(你的Apache開沒開?)
的話,應該是訪問到了下面這個頁面:
咱們嘗試下訪問原來的URL:
會發現已經返回了頁面錯誤。
這是由於TP5.0遵循惟一的URL地址設計。
瞭解過HTTP協議的童鞋應該知道,在請求中最經常使用的就是GET和POST請求。
一樣,咱們能夠很方便的爲咱們的路由制定請求類型,趙童鞋就用GET請求來舉例。
咱們繼續使用上面提到的hello路由來舉例,制定GET請求類型只須要將route.php文件修改成:
那麼咱們該怎麼測試呢?這時候就須要用到咱們以前安裝的Postman來作了。
將請求方法設置爲GET,填寫URL:
點擊Send就能夠看到,請求是成功返回的。
而咱們將請求方法設置爲POST,並點擊Send。
能夠看到,Status爲404 Not Found,而且返回了錯誤頁面。
POST路由規則指定就請童鞋們本身親自嘗試啦~
在TP框架的路由中定義路由變量也很是簡單。
只須要在定義路由規則時,加入你想接收的變量,以下圖:
接着在hello()方法中獲取變量,以下圖:
訪問URL:
就能夠看到,成功的獲取到了URL中傳遞的路由變量。
在實際的使用中,會涉及到大量的相同URL前綴的路由規則,例以下面的一組路由:
而路由分組就可以解決這個問題。
本章咱們學到了四個路由操做:定義路由、指定請求類型、路由變量、路由分組,若是再加上依賴注入(DI)這種設計模式就能夠很容易地去實現Api開發中的RESTful Api風格。
TP5中的路由功能遠遠不止以上這四種,還有許多的例如:別名路由、資源路由、僞靜態訪問、操做方法前綴等操做,可是平常的開發中會比較少用到,有興趣地童鞋能夠參考官方文檔來更深刻地瞭解路由功能。
下一章咱們就會進入到控制器的講解。
大家覺得本章到此結束了嗎???
錯!!!
下面開始進行進階模式:
上面咱們學習到了路由的使用方法,童鞋們好很差奇爲何在route.php
中定義了規則後,框架可以爲咱們的請求(Request)導航到指定的控制器(Controller)和操做(Action)呢?
路由小朋友究竟都幹了些什麼呢?
咱們下面來探究一下TP5中路由的祕密。
本次咱們使用剛寫好的路由規則「hello/:name」來進行舉例。
首先咱們來到入口文件index.php。
能夠看到,index.php實際功能只是加載了thinkphp/start.php這個文件,那咱們就去這個文件裏看看。
start.php文件其實才是真正的框架入口,它調用了App類的run()
方法,從方法名咱們能夠看出,整個框架就是在這裏開始跑起來的。
咱們進入到run()
方法中看看這裏有沒有路由相關的操做,在run()
方法中搜索關鍵字「route」。
在這裏發現了一個routeCheck()
方法,這個就是路由乾的好事:檢測當前的request究竟要調用什麼東西。
在這個方法裏,TP5的路由檢測一共分爲了幾個階段:判斷是否開啓路由、讀取路由緩存、導入路由配置、路由檢測等。
其中的導入路由配置就是加載了route.php
文件中的路由規則。
而咱們須要看的,應該就是其中的路由檢測階段,也就是Route::check()
方法。
因爲咱們本次舉例的路由規則「hello/:name」是動態路由規則,因此最終代碼會進入到checkRoute()
,這個方法裏面會檢測咱們在route.php文件中配置的規則,並最終返回咱們須要調用的代碼位置。
checkRoute()
中開頭就有一個foreach,而循環遍歷的變量$rules
就是咱們在route.php
中配置的全部路由規則。
當checkRoute()
作完請求參數有效性校驗後,就會把解析出來的路由規則放到checkRule()
中進行規則定義檢測。
作完一大堆的檢測後,第一個重點來了,checkRule()
就會把請求url和規則rule放到match()
方法中進行匹配。
當match()
匹配規則成功以後,就輪到第二個重點了,框架會調用parseRule()
來進行解析路由規則。
繼續往下看,TP5就是調用這段代碼來進行路由規則解析:
parseRule()
方法最後會返回一個$result
變量,使用XDEBUG能夠看到返回值爲一個數組,其中包括了三個重要的信息:index模塊、index控制器、hello方法。(若是不會配置XDEBUG的童鞋能夠在公衆號後臺給趙童鞋留言哦~)
接下來回到最最最上層的App:run()
方法中查看,routeCheck()
方法的返回值$dispatch
就是剛纔解析出來的路由地址。
接下來TP5就會將解析出來的信息扔到exec()
方法中執行,經過查看exec()
方法能夠知道,框架會根據返回值中的type來進行路由分發。
接下來……Stop!!!
再往下就是控制器(Controller)的領域了
童鞋們有沒有在框架源碼的海洋繞暈了呢?
欲知後事如何,請聽下回分解。
----- End -----
更多好文
請掃描下面二維碼
歡迎關注~