原文地址:http://www.insp.top/article/10
目前我們大致了解了laravel下糜烹,在開始一個Http程序需要先定義路由龄砰。之前的例子中立帖,我們的業(yè)務邏輯都是在路由里實現(xiàn)咐容,這對于簡單的網(wǎng)站或web應用沒什么問題栅螟,當我們需要擴大規(guī)模,程序變得復雜徐钠,分層的業(yè)務邏輯更為適合癌刽。這時候,我們就應該使用控制器。
了解MVC的都對控制器的作用有所了解显拜,控制器是實現(xiàn)主要業(yè)務邏輯的衡奥。在其他框架,控制器一般就是一個類远荠,laravel也不例外矮固,laravel的控制其結構并沒有什么特殊。
上述例子中就是laravel的控制器結構譬淳,沒什么特別的档址。可以看得到瘦赫,Laravel的控制器非常的干凈辰晕,與其他類的耦合度相當?shù)牡透蛴5靡嬗趌aravel的IoC容器确虱,我們很容易實現(xiàn)相當豐富的功能,且不會產生緊密耦合替裆。那么如何才能訪問到這個控制器里的邏輯呢校辩?
我們所知道的許多框架,通常有著既定的路由規(guī)則辆童,我個人比較熟悉TP宜咒,TP的默認路由規(guī)則是http://yourdomain/Module/Controller/Action,假如我們訪問http://yourdomain/Content/Home/index把鉴,默認會將請求派發(fā)至Content模塊下的HomeController類的index方法故黑。
ThinkPHP這種默認路由規(guī)則使得框架開箱即用,十分便捷庭砍。但是這樣并不靈活场晶,假如我想通過訪問http://yourdomain/user/1就訪問到UserController控制器下的show方法并包含一個值為1的參數(shù),ThinkPHP你需要修改配置(并且那個配置非常不優(yōu)雅)怠缸,亦或者我想要通過向http://yourdomain/topicPOST一個數(shù)據(jù)以添加一篇文章诗轻,處理這個過程的實際是Admin\TopicController類的create方法,且該方法只接受POST請求揭北,這時候似乎大多數(shù)框架就要通過寫更多的代碼實現(xiàn)了扳炬。
說到這里,似乎大家是不是想起了laravel那種路由定義方式的好處了搔体?雖然laravel沒有強加給你既定的路由規(guī)則恨樟,但你擁有了更多定制的權利,并且laravel定義路由的方式非常優(yōu)雅疚俱,帶給你的體驗非常豐富劝术。另一個好消息是,定義控制器路由和普通路由有所差別,這個差別是在便利性上的夯尽,你將很快感受到這種便利帶給你的好處瞧壮!
說到現(xiàn)在,已經積累了很多疑惑匙握,我們現(xiàn)在開始正式講述laravel的控制器與控制器路由咆槽。
控制器路由#
我們之前代碼示例中,看到了一個十分簡單的控制器圈纺,但是要知道秦忿,定義了控制器你是無法直接使用的,要知道一個來自客戶端的請求會經過路由蛾娶,經過解析最終按照規(guī)則派發(fā)至具體的處理邏輯灯谣。
我們知道如何定義一個路由,但之前的路由里包含了邏輯蛔琅,我們如何將這個路由的邏輯轉到控制器呢胎许?我們希望通過http://yourdomain/訪問到我們上面例子中的HomeController類的index方法,應該這樣定義一條路由:
例子很簡單罗售。但是這種定義方法會帶來一種問題辜窑。
關于laravel的路由定義,很多人看到后有一個疑惑:
每條地址規(guī)則都要定義路由寨躁,豈不是很累穆碎?
這個問題確實是個問題,不過职恳,laravel給了我們一個折中的方案——控制器路由所禀。
控制器路由我認為主要是解決路由定義繁雜的情況,因為大型的應用業(yè)務復雜放钦,控制器相當?shù)亩嗌牵覀儾豢赡苊恳粋€控制器的方法都要定義一個路由。Laravel的控制器路由可以完美解決問題:
我們的控制器方法的寫法也要有所變化:
依照上述例子最筒,如果我們訪問地址http://yourdomain/就會顯示HomeController的getIndex方法產生的內容贺氓,訪問http://yourdomain/about,就會顯示getAbout方法產生的內容床蜘。除了使用如get{Method}這種格式辙培,還可以有post{Method}、delete{Method}等邢锯,至于前綴get扬蕊,post等代表的意義,應該猜得出吧丹擎?
相關部分尾抑,官方文檔已經很詳細寫出歇父。可以繼續(xù)去了解再愈,上述內容屬于控制器章節(jié)的隱式控制器榜苫。
現(xiàn)在我們已經看到,這樣的定義我們可以不用再給控制器的每一個方法定義一個路由翎冲,只需給控制器定義一個路由即可垂睬。
資源控制器#
RESTful是一種設計思想、一種普遍接受的規(guī)范抗悍。我們的資源控制器驹饺,和RESTful有著莫大的聯(lián)系,要理解資源控制器缴渊,必須先了解RESTful赏壹。
Laravel的資源控制器原生的支持了RESTful架構。其實laravel的資源控制器和其他控制器沒什么直接區(qū)別衔沼,只是對控制器類的方法和結構略有規(guī)定蝌借,不過我們并不要手動創(chuàng)建資源控制器,我們可以利用laravel的命令行工具——artisan俐巴。
在laravel框架根目錄下骨望,通過命令行輸入命令
就可以創(chuàng)建一個名為ArticleController的資源控制器硬爆,文件默認在app/Http/Controllers下欣舵。我們打開ArticleController.php,發(fā)現(xiàn)里面已經寫好了許多方法缀磕,比如index缘圈、create、show等等袜蚕。分別是什么意思糟把?如何在路由定義才能訪問到?
我們如果要在路由里定義一個資源控制器只需要一條:
這個時候牲剃,肯定有人會疑惑遣疯,那訪問的地址規(guī)則呢?如果你已經了解了RESTful凿傅,再去閱讀以下官方文檔缠犀,基本就已經明白了。我就著上述的控制器聪舒、路由辨液,來說明。先看一張表:
請求方法請求URI對應的控制器方法代表的意義
大概挑兩條解釋箱残。
我定義了個資源路由Route::resource('article', 'ArticleController');滔迈。
當我訪問地址http://yourdomain/article止吁,相當于訪問控制器ArticleController的index方法。
當我訪問地址http://yourdomain/article/create燎悍,就會訪問到create方法敬惦。
當我通過POST提交數(shù)據(jù)至地址http://yourdomain/article,相當于由store方法處理谈山。
現(xiàn)在理解了嗎仁热?通過資源控制器,我們很容易實現(xiàn)一個符合RESTful架構的接口勾哩,這種很適合作為APP后端開發(fā)時使用抗蠢。這種規(guī)范下,不但訪問策略清晰易理解思劳,更容易維護迅矛。也使你的架構更為合理和現(xiàn)代化。
當然潜叛,復雜的業(yè)務邏輯使得資源控制器還不僅僅這么使用秽褒,但當你理解了這種最為基本的,其他的也不會太難威兜。文檔中對控制器的其他部分做出相當詳細的描寫销斟,本著作為文檔的補充,這些文檔中已經存在且足夠理解的椒舵,就不再復述蚂踊。
我會在以后針對不足的地方補充。謝謝觀看笔宿。