laravel 學習筆記——路由(基礎)

學習 laravel 必須要學習其路由,路由是 laravel 的特色,更是一個重中之重。是體驗 laravel 優雅和美妙的第一站。

此路由非彼路由,不要和路由器的路由搞混淆了,雖然他們都有着分發請求的作用。

在這裏,路由是指分析來自客戶端請求的統一資源標識符(URI),根據設定的規則將請求分發至期待的處理邏輯,這一規則就是路由規則,而這一過程就是路由。

假設我們有這樣一段簡單的處理邏輯:

  1. echo 'hello, world';

我希望通過 URL http://yourdomain/host 訪問到這段處理邏輯,我們的路由規則就應該是 /host ,該規則接受的請求類型是 GET。如何在 laravel 內實現呢?我們通過編輯 laravel 框架目錄下的app/Http/routes.php,添加以下代碼:

  1. Route::get('host', function() {
  2. echo 'hello, world';
  3. });

就實現了我們之前所想的那樣。通過這樣一段簡單的示例,我們至少應該明白路由是幹啥的,其實就是用來匹配請求地址的。很多人不習慣是由於之前的框架已經給你制定好了一套規則,而現在,這個選擇權全在於你,你擁有定製規則的最高權限。所以,這不是麻煩,而是更加靈活。讓我們繼續深入瞭解,你會愛上他的。

綜述

laravel 的路由給了我們更多定製規則的理由。我開始並不習慣這樣,我是一個從 ThinkPHP 轉過來的初學者,習慣了 ThinkPHP 的默認路由規則,http://yourdomain/Module/Controller/Action,這樣的路由規則讓你只需要去寫控制器就行了,如果還需要定製或精簡,可以通過配置文件調整和修改路由規則。

雖然承認 TP 這種框架和其他同類框架依舊可以同歸配置實現同樣的靈活的路由規則,但是,不可避免的事,就是你需要在他的規則體系下安排控制器、模型,誰都知道,這些控制器的基類雜糅了一堆來自其他類的方法,高度耦合,嚴重的增加了額外開銷,擴展性並不是很好或者擴展過於麻煩。

相反,如果你只是簡單的一個程序,laravel 則可以通過靈活的路由定製,創建一個簡單而富有活力的程序,甚至不需要創建一個標準的控制器!

Laravel 的控制器爲什麼不類似於 TP 之流的框架呢?因爲 laravel 的控制器是爲了組織一類行爲的,或針對某一資源建立一個標準的資源控制器。而 TP、CI 之流控制器的意義變得更爲重要,是整個框架中實現邏輯的主要成分。Laravel 實現主要邏輯的可以是一系列類庫,簡單的邏輯甚至直接可以在路由實現,而控制器僅僅是一種實現方式之一。Laravel 這種設計在複雜項目中更爲科學,使得分層系統得以十分容易的實現。

必須要知道的幾件事

學習 laravel 的路由,有一樣基礎絕對不能丟—— HTTP 協議基礎。不要求完全瞭解 HTTP 協議,但必須要知道一小部分概念。如果對其不瞭解,會在閱讀 laravel 文檔時出現很多疑惑。我在這裏簡單講一部分。

xkcd漫畫中的http請求流程

Http 請求的流程如上圖,客戶端發送 HTTP 請求報文至服務器,服務器響應相應的請求。

客戶端請求有很多種方法,常見的有 GETPOST。通常而言,我們在瀏覽器通過輸入網址回車,都是以 GET 的方式請求數據,而通過表單提交,一般都是以 POST 方式提交。對於請求方法,在沒有學習 laravel 之前我也只停留在這個層面,但是現在,你必須要知道除了 GET,POST 之外,還有 PUTDELETE 等等。

除了請求地址,還有請求主機和資源,請求主機一般是完整域名和 IP 地址,如www.a.com 或 142.53.75.112,資源其實是一個合法的統一資源標識符(URI),相對於服務受理程序的目錄,如 /index.php/article/1

以上部分都算是 HTTP 協議中請求部分的請求頭,如果你是通過 POST、PUT 方法請求,還會包含請求體,請求體內是具體的數據。

大家應該去了解一下 RESTful,這是一種設計思想,這對學習 laravel 的路由有很大的幫助,尤其是在學習 laravel 控制器的資源控制器部分,很多人的疑惑都是在不瞭解 RESTful 的情況下產生的。阮一峯的日誌中有兩篇詳細講解了 RESTful,本人就不再班門弄斧,其中一篇的傳送門在此給出:http://www.ruanyifeng.com/blog/2011/09/restful.html

正式開始瞭解 laravel 的路由

以下文章默認認爲讀者已經大致瞭解 RESTful 和 HTTP 協議,期間出現的名詞不再註解。

Laravel 的路由靈活的確在某一程度上麻煩了,但我所瞭解的,這個麻煩絕對不是浪費時間,反而節約了大部分開發時間,並且完美提升了開發效率。

我們定義一下路由:

  1. Route::get('/', function() {
  2. return view('index');
  3. });

意味着我們訪問 http://yourdoamin/ 會顯示渲染後的視圖文件 index 的內容。這對於製作一個網站首頁而言,十分簡明,不需要再額外創建控制器。當然,如果你的程序中,顯示首頁是一類組織方法中的一部分,也可以用控制器實現,關於控制器我會在後面說到。

假如我想通過地址 http://yourdomain/about 訪問到我博客的關於頁面,該頁面在視圖about 文件內定義的,該如何定義路由?

  1. Route::get('about', function() {
  2. return view('about');
  3. });

那麼現在我的博客有一堆文章,我想通過地址 http://yourdomain/article/1 訪問 id 爲 1 的文章,通過 http://yourdomain/article/2 訪問 id 爲 2 的文章怎麼辦?

  1. Route::get('article/{id}', function($id) {
  2. return 'Article:' . $id;
  3. });

但是,我們都知道,大多數情況下,id 只能是數字,如何才能保證我們取到的只可以數字?而其他的則會被忽略?這樣定義即可:

  1. Route::get('article/{id}', function($id) {
  2. return 'Article:' . $id;
  3. })->where('id', '[0-9]+');

這樣定義的話,如果輸入的地址是 http://yourdomain/article/a 則不會被匹配至該路由。我們可以很容易看得出,這是通過正則制定的規則,也就是說,我們可以根據情況來制定需要的匹配規則。

但是,假如有這樣一種情況,有很多地方都需要 id 作爲參數,id 大都是這種數字,我們肯定不希望每一個路由規則都要寫一次 where 方法來設置 id 的匹配規則。這時候可以通過這樣一個方法來實現:

  1. Route::pattern('id', '[0-9]+');

這樣的話,每一個路由規則內出現 {id},都會以該規則去匹配。Laravel5 官方文檔中建議通過在 RouteServiceProvider 中的 boot 方法裏定義上述內容,具體方法移步官方文檔。

讀到這裏,應該對創建一個簡單路由有所概念。本文不會全面羅列官方文檔中所有內容,只是在容易犯迷糊的地方針對性詳細講解。建議多去閱讀官方文檔,並嘗試裏面給出的例子。要知道去嘗試的時候你的電腦和服務器不會炸裂。

除了通過 Route::get() 定義一個匹配GET請求的路由還可以定義處理 POST、PUT、DELETE 的路由,分別是 Route::post()Route::put()Route::delete()。我所瞭解的大多數瀏覽器的表單 form 僅支持 GET 和 POST,那麼如何實現另外兩個呢?

一種是通過 ajax 實現,因爲本質上瀏覽器是支持其他請求方法的。但是有時候一些項目只是想通過表單實現,官方文檔提供了另一種解決方案,就是 方法欺騙,可以參考國內一個翻譯了的文檔,給出傳送門 http://laravel-china.org/docs/5.0/routing#method-spoofing.

運用好路由,可以寫出優雅的接口,這對於 App 後端開發相當有用。遵循 RESTful,會讓你的程序更加規範。


原文:https://www.insp.top/article/learn-laravel-route-basic

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章