趙童鞋帶你入門PHP(七) ThinkPHP路由篇

閱讀時長:10分鐘php

技術預備:ThinkPHP框架基礎用法程序員

上一章咱們簡單介紹了MVC框架的三大件:控制器、模型、視圖,以及路由。thinkphp

童鞋們還記得一個URL請求的執行過程嗎?設計模式

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

這章咱們仍是按照趙童鞋一向的風格,省略掉80%比較少用的功能,講解一下TP5中路由的經常使用操做。緩存

1、定義路由

上一章中,咱們在Index控制器中新增了hello()方法,經過訪問URL:app

tp5.com/index/index…框架

就能夠訪問到hello()方法裏的代碼。(童鞋們記得課前先配置虛擬域名哦~)學習

這裏就出現了一個問題,URL也太太太長了。測試

「懶惰的程序員們」想到了一個好辦法去解決:定義一個短的URL去代替長的URL,也就是定義路由規則。

在TP5中定義應用的路由規則,直接在application/route.php文件中添加路由規則便可。

咱們就定義一個hello路由到上面提到的index/index/hello操做。

框架爲咱們提供了兩種定義方式。

靜態註冊:

動態註冊:

靜態註冊和動態註冊的規律是同樣的:第一個參數稱爲路由規則(經過路由訪問的地址),第二個參數爲該規則對應的路由地址(也就是原來定義路由以前訪問的URL地址)

趙童鞋推薦使用動態註冊,動態註冊是TP官方推薦的作法,同時也是Laravel等其餘框架比較通用的作法,畢竟咱們雖然學習了TP框架,但工做時並不必定會使用上,學會其中通用的部分最實際。

路由規則定義好以後,嘗試訪問URL:

tp5.com/hello

若是不出意外(你的Apache開沒開?)的話,應該是訪問到了下面這個頁面:

咱們嘗試下訪問原來的URL:

tp5.com/index/index…

會發現已經返回了頁面錯誤。

這是由於TP5.0遵循惟一的URL地址設計。

2、指定請求類型

瞭解過HTTP協議的童鞋應該知道,在請求中最經常使用的就是GET和POST請求。

一樣,咱們能夠很方便的爲咱們的路由制定請求類型,趙童鞋就用GET請求來舉例。

咱們繼續使用上面提到的hello路由來舉例,制定GET請求類型只須要將route.php文件修改成:

那麼咱們該怎麼測試呢?這時候就須要用到咱們以前安裝的Postman來作了。

將請求方法設置爲GET,填寫URL:

tp5.com/hello

點擊Send就能夠看到,請求是成功返回的。

而咱們將請求方法設置爲POST,並點擊Send。

能夠看到,Status爲404 Not Found,而且返回了錯誤頁面。

POST路由規則指定就請童鞋們本身親自嘗試啦~

3、路由變量

在TP框架的路由中定義路由變量也很是簡單。

只須要在定義路由規則時,加入你想接收的變量,以下圖:

接着在hello()方法中獲取變量,以下圖:

訪問URL:

tp5.com/hello/zhaot…

就能夠看到,成功的獲取到了URL中傳遞的路由變量。

4、路由分組

在實際的使用中,會涉及到大量的相同URL前綴的路由規則,例以下面的一組路由:

而路由分組就可以解決這個問題。

5、總結

本章咱們學到了四個路由操做:定義路由、指定請求類型、路由變量、路由分組,若是再加上依賴注入(DI)這種設計模式就能夠很容易地去實現Api開發中的RESTful Api風格。

TP5中的路由功能遠遠不止以上這四種,還有許多的例如:別名路由、資源路由、僞靜態訪問、操做方法前綴等操做,可是平常的開發中會比較少用到,有興趣地童鞋能夠參考官方文檔來更深刻地瞭解路由功能。

下一章咱們就會進入到控制器的講解。

大家覺得本章到此結束了嗎???

錯!!!

下面開始進行進階模式:

6、路由進階

上面咱們學習到了路由的使用方法,童鞋們好很差奇爲何在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 -----

更多好文

請掃描下面二維碼

歡迎關注~

相關文章
相關標籤/搜索