laravel 學習筆記——路由(路由與控制器)

目前我們大致瞭解了 laravel 下,在開始一個 Http 程序需要先定義路由。之前的例子中,我們的業務邏輯都是在路由裏實現,這對於簡單的網站或 web 應用沒什麼問題,當我們需要擴大規模,程序變得複雜,分層的業務邏輯更爲適合。這時候,我們就應該使用控制器。

瞭解 MVC 的都對控制器的作用有所瞭解,控制器是實現主要業務邏輯的。在其他框架,控制器一般就是一個類,laravel 也不例外,laravel 的控制其結構並沒有什麼特殊。

  1. <?php
  2. namespace App\Http\Controllers;
  3.  
  4. use App\Http\Controllers\Controller;
  5.  
  6. class HomeController extends Controller {
  7.  
  8. /**
  9. * 顯示首頁。
  10. *
  11. * @return Response
  12. */
  13. public function index()
  14. {
  15. return view('home');
  16. }
  17.  
  18. }

上述例子中就是 laravel 的控制器結構,沒什麼特別的。可以看得到,Laravel 的控制器非常的乾淨,與其他類的耦合度相當的低。得益於 laravel 的 IoC 容器,我們很容易實現相當豐富的功能,且不會產生緊密耦合。那麼如何才能訪問到這個控制器裏的邏輯呢?

我們所知道的許多框架,通常有着既定的路由規則,我個人比較熟悉 TP,TP 的默認路由規則是 http://yourdomain/Module/Controller/Action,假如我們訪問http://yourdomain/Content/Home/index,默認會將請求派發至 Content 模塊下的HomeController類的 index 方法。

ThinkPHP 這種默認路由規則使得框架開箱即用,十分便捷。但是這樣並不靈活,假如我想通過訪問 http://yourdomain/user/1 就訪問到 UserController 控制器下的 show 方法幷包含一個值爲 1 的參數,ThinkPHP 你需要修改配置(並且那個配置非常不優雅),亦或者我想要通過向 http://yourdomain/topic POST 一個數據以添加一篇文章,處理這個過程的實際是 Admin\TopicController 類的 create 方法,且該方法只接受 POST 請求,這時候似乎大多數框架就要通過寫更多的代碼實現了。

說到這裏,似乎大家是不是想起了 laravel 那種路由定義方式的好處了?雖然 laravel 沒有強加給你既定的路由規則,但你擁有了更多定製的權利,並且 laravel 定義路由的方式非常優雅,帶給你的體驗非常豐富。另一個好消息是,定義控制器路由和普通路由有所差別,這個差別是在便利性上的,你將很快感受到這種便利帶給你的好處!

說到現在,已經積累了很多疑惑,我們現在開始正式講述 laravel 的控制器與控制器路由。

控制器路由

我們之前代碼示例中,看到了一個十分簡單的控制器,但是要知道,定義了控制器你是無法直接使用的,要知道一個來自客戶端的請求會經過路由,經過解析最終按照規則派發至具體的處理邏輯。

我們知道如何定義一個路由,但之前的路由裏包含了邏輯,我們如何將這個路由的邏輯轉到控制器呢?我們希望通過 http://yourdomain/ 訪問到我們上面例子中的HomeController 類的 index 方法,應該這樣定義一條路由:

  1. Route::get('/', 'HomeController@index');

例子很簡單。但是這種定義方法會帶來一種問題。

關於laravel的路由定義,很多人看到後有一個疑惑:

每條地址規則都要定義路由,豈不是很累?

這個問題確實是個問題,不過,laravel 給了我們一個折中的方案——控制器路由。

控制器路由我認爲主要是解決路由定義繁雜的情況,因爲大型的應用業務複雜,控制器相當的多,我們不可能每一個控制器的方法都要定義一個路由。Laravel 的控制器路由可以完美解決問題:

  1. Route::controller('/', 'HomeController');

我們的控制器方法的寫法也要有所變化:

  1. <?php
  2. namespace App\Http\Controllers;
  3.  
  4. use App\Http\Controllers\Controller;
  5.  
  6. class HomeController extends Controller {
  7.  
  8. /**
  9. * 顯示首頁。
  10. *
  11. * @return Response
  12. */
  13. public function getIndex()
  14. {
  15. return view('home');
  16. }
  17.  
  18. /**
  19. * 顯示關於界面
  20. *
  21. * @return Response
  22. */
  23. public function getAbout()
  24. {
  25. return view('about');
  26. }
  27. }

依照上述例子,如果我們訪問地址 http://yourdomain/ 就會顯示 HomeController 的getIndex 方法產生的內容,訪問 http://yourdomain/about,就會顯示 getAbout 方法產生的內容。除了使用如 get{Method} 這種格式,還可以有post{Method}delete{Method} 等,至於前綴 getpost 等代表的意義,應該猜得出吧?

相關部分,官方文檔已經很詳細寫出。可以繼續去了解,上述內容屬於控制器章節的 隱式控制器

現在我們已經看到,這樣的定義我們可以不用再給控制器的每一個方法定義一個路由,只需給控制器定義一個路由即可。

資源控制器

RESTful 是一種設計思想、一種普遍接受的規範。我們的資源控制器,和 RESTful 有着莫大的聯繫,要理解資源控制器,必須先了解 RESTful。

REST 這個詞,是 Roy Thomas Fielding 在他 2000 年的博士論文中提出的。

Fielding 是一個非常重要的人,他是 HTTP 協議(1.0版和1.1版)的主要設計者、Apache 服務器軟件的作者之一、Apache 基金會的第一任主席。所以,他的這篇論文一經發表,就引起了關注,並且立即對互聯網開發產生了深遠的影響。

Fielding 將他對互聯網軟件的架構原則,定名爲 REST,即 Representational State Transfer 的縮寫。我對這個詞組的翻譯是"表現層狀態轉化"。

如果一個架構符合 REST 原則,就稱它爲 RESTful 架構。

要理解 RESTful 架構,最好的方法就是去理解 Representational State Transfer 這個詞組到底是什麼意思,它的每一個詞代表了什麼涵義。如果你把這個名稱搞懂了,也就不難體會 REST 是一種什麼樣的設計。

大家一定要閱讀該文章,理解RESTful架構 ,文章十分清晰的講述了 RESTful,本文就不再重複熬述。

Laravel 的資源控制器原生的支持了 RESTful 架構。其實 laravel 的資源控制器和其他控制器沒什麼直接區別,只是對控制器類的方法和結構略有規定,不過我們並不要手動創建資源控制器,我們可以利用 laravel 的命令行工具 —— artisan

在laravel框架根目錄下,通過命令行輸入命令

  1. php artisan make:controller ArticleController

就可以創建一個名爲 ArticleController 的資源控制器,文件默認在app/Http/Controllers 下。我們打開 ArticleController.php,發現裏面已經寫好了許多方法,比如 index、create、show 等等。分別是什麼意思?如何在路由定義才能訪問到?

我們如果要在路由裏定義一個資源控制器只需要一條:

  1. Route::resource('article', 'ArticleController');

這個時候,肯定有人會疑惑,那訪問的地址規則呢?如果你已經瞭解了 RESTful,再去閱讀以下官方文檔,基本就已經明白了。我就着上述的控制器、路由,來說明。先看一張表:

請求方法 請求 URI 對應的控制器方法 代表的意義
GET /article index 索引/列表
GET /article/create create 創建(顯示錶單)
POST /article store 保存你創建的數據
GET /article/{id} show 顯示對應id的內容
GET /article/{id}/edit edit 編輯(顯示錶單)
PUT/PATCH /article/{id} save 保存你編輯的數據
DELETE /article/{id} destroy 刪除

大概挑兩條解釋。

我定義了個資源路由 Route::resource('article', 'ArticleController');

當我訪問地址 http://yourdomain/article ,相當於訪問控制器 ArticleController 的index 方法。

當我訪問地址 http://yourdomain/article/create ,就會訪問到 create 方法。

當我通過 POST 提交數據至地址 http://yourdomain/article,相當於由 store 方法處理。

現在理解了嗎?通過資源控制器,我們很容易實現一個符合 RESTful 架構的接口,這種很適合作爲 APP 後端開發時使用。這種規範下,不但訪問策略清晰易理解,更容易維護。也使你的架構更爲合理和現代化。

當然,複雜的業務邏輯使得資源控制器還不僅僅這麼使用,但當你理解了這種最爲基本的,其他的也不會太難。文檔中對控制器的其他部分做出相當詳細的描寫,本着作爲文檔的補充,這些文檔中已經存在且足夠理解的,就不再複述。

我會在以後針對不足的地方補充。謝謝觀看。smile

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

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