Laravel 學(xué)習(xí)筆記——路由(路由與控制器)

原文地址:http://www.insp.top/article/10

目前我們大致了解了laravel下,在開(kāi)始一個(gè)Http程序需要先定義路由。之前的例子中,我們的業(yè)務(wù)邏輯都是在路由里實(shí)現(xiàn),這對(duì)于簡(jiǎn)單的網(wǎng)站或web應(yīng)用沒(méi)什么問(wèn)題,當(dāng)我們需要擴(kuò)大規(guī)模,程序變得復(fù)雜,分層的業(yè)務(wù)邏輯更為適合。這時(shí)候,我們就應(yīng)該使用控制器。

了解MVC的都對(duì)控制器的作用有所了解,控制器是實(shí)現(xiàn)主要業(yè)務(wù)邏輯的。在其他框架,控制器一般就是一個(gè)類,laravel也不例外,laravel的控制其結(jié)構(gòu)并沒(méi)有什么特殊。


上述例子中就是laravel的控制器結(jié)構(gòu),沒(méi)什么特別的。可以看得到,Laravel的控制器非常的干凈,與其他類的耦合度相當(dāng)?shù)牡汀5靡嬗趌aravel的IoC容器,我們很容易實(shí)現(xiàn)相當(dāng)豐富的功能,且不會(huì)產(chǎn)生緊密耦合。那么如何才能訪問(wèn)到這個(gè)控制器里的邏輯呢?

我們所知道的許多框架,通常有著既定的路由規(guī)則,我個(gè)人比較熟悉TP,TP的默認(rèn)路由規(guī)則是http://yourdomain/Module/Controller/Action,假如我們?cè)L問(wèn)http://yourdomain/Content/Home/index,默認(rèn)會(huì)將請(qǐng)求派發(fā)至Content模塊下的HomeController類的index方法。

ThinkPHP這種默認(rèn)路由規(guī)則使得框架開(kāi)箱即用,十分便捷。但是這樣并不靈活,假如我想通過(guò)訪問(wèn)http://yourdomain/user/1就訪問(wèn)到UserController控制器下的show方法并包含一個(gè)值為1的參數(shù),ThinkPHP你需要修改配置(并且那個(gè)配置非常不優(yōu)雅),亦或者我想要通過(guò)向http://yourdomain/topicPOST一個(gè)數(shù)據(jù)以添加一篇文章,處理這個(gè)過(guò)程的實(shí)際是Admin\TopicController類的create方法,且該方法只接受POST請(qǐng)求,這時(shí)候似乎大多數(shù)框架就要通過(guò)寫(xiě)更多的代碼實(shí)現(xiàn)了。

說(shuō)到這里,似乎大家是不是想起了laravel那種路由定義方式的好處了?雖然laravel沒(méi)有強(qiáng)加給你既定的路由規(guī)則,但你擁有了更多定制的權(quán)利,并且laravel定義路由的方式非常優(yōu)雅,帶給你的體驗(yàn)非常豐富。另一個(gè)好消息是,定義控制器路由和普通路由有所差別,這個(gè)差別是在便利性上的,你將很快感受到這種便利帶給你的好處!

說(shuō)到現(xiàn)在,已經(jīng)積累了很多疑惑,我們現(xiàn)在開(kāi)始正式講述laravel的控制器與控制器路由。

控制器路由#

我們之前代碼示例中,看到了一個(gè)十分簡(jiǎn)單的控制器,但是要知道,定義了控制器你是無(wú)法直接使用的,要知道一個(gè)來(lái)自客戶端的請(qǐng)求會(huì)經(jīng)過(guò)路由,經(jīng)過(guò)解析最終按照規(guī)則派發(fā)至具體的處理邏輯。

我們知道如何定義一個(gè)路由,但之前的路由里包含了邏輯,我們?nèi)绾螌⑦@個(gè)路由的邏輯轉(zhuǎn)到控制器呢?我們希望通過(guò)http://yourdomain/訪問(wèn)到我們上面例子中的HomeController類的index方法,應(yīng)該這樣定義一條路由:


例子很簡(jiǎn)單。但是這種定義方法會(huì)帶來(lái)一種問(wèn)題。

關(guān)于laravel的路由定義,很多人看到后有一個(gè)疑惑:

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

這個(gè)問(wèn)題確實(shí)是個(gè)問(wèn)題,不過(guò),laravel給了我們一個(gè)折中的方案——控制器路由。

控制器路由我認(rèn)為主要是解決路由定義繁雜的情況,因?yàn)榇笮偷膽?yīng)用業(yè)務(wù)復(fù)雜,控制器相當(dāng)?shù)亩啵覀儾豢赡苊恳粋€(gè)控制器的方法都要定義一個(gè)路由。Laravel的控制器路由可以完美解決問(wèn)題:


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

依照上述例子,如果我們?cè)L問(wèn)地址http://yourdomain/就會(huì)顯示HomeController的getIndex方法產(chǎn)生的內(nèi)容,訪問(wèn)http://yourdomain/about,就會(huì)顯示getAbout方法產(chǎn)生的內(nèi)容。除了使用如get{Method}這種格式,還可以有post{Method}、delete{Method}等,至于前綴get,post等代表的意義,應(yīng)該猜得出吧?

相關(guān)部分,官方文檔已經(jīng)很詳細(xì)寫(xiě)出。可以繼續(xù)去了解,上述內(nèi)容屬于控制器章節(jié)的隱式控制器。

現(xiàn)在我們已經(jīng)看到,這樣的定義我們可以不用再給控制器的每一個(gè)方法定義一個(gè)路由,只需給控制器定義一個(gè)路由即可。

資源控制器#

RESTful是一種設(shè)計(jì)思想、一種普遍接受的規(guī)范。我們的資源控制器,和RESTful有著莫大的聯(lián)系,要理解資源控制器,必須先了解RESTful。


Laravel的資源控制器原生的支持了RESTful架構(gòu)。其實(shí)laravel的資源控制器和其他控制器沒(méi)什么直接區(qū)別,只是對(duì)控制器類的方法和結(jié)構(gòu)略有規(guī)定,不過(guò)我們并不要手動(dòng)創(chuàng)建資源控制器,我們可以利用laravel的命令行工具——artisan。

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

就可以創(chuàng)建一個(gè)名為ArticleController的資源控制器,文件默認(rèn)在app/Http/Controllers下。我們打開(kāi)ArticleController.php,發(fā)現(xiàn)里面已經(jīng)寫(xiě)好了許多方法,比如index、create、show等等。分別是什么意思?如何在路由定義才能訪問(wèn)到?

我們?nèi)绻诼酚衫锒x一個(gè)資源控制器只需要一條:

這個(gè)時(shí)候,肯定有人會(huì)疑惑,那訪問(wèn)的地址規(guī)則呢?如果你已經(jīng)了解了RESTful,再去閱讀以下官方文檔,基本就已經(jīng)明白了。我就著上述的控制器、路由,來(lái)說(shuō)明。先看一張表:

請(qǐng)求方法請(qǐng)求URI對(duì)應(yīng)的控制器方法代表的意義


大概挑兩條解釋。

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

當(dāng)我訪問(wèn)地址http://yourdomain/article,相當(dāng)于訪問(wèn)控制器ArticleController的index方法。

當(dāng)我訪問(wèn)地址http://yourdomain/article/create,就會(huì)訪問(wèn)到create方法。

當(dāng)我通過(guò)POST提交數(shù)據(jù)至地址http://yourdomain/article,相當(dāng)于由store方法處理。

現(xiàn)在理解了嗎?通過(guò)資源控制器,我們很容易實(shí)現(xiàn)一個(gè)符合RESTful架構(gòu)的接口,這種很適合作為APP后端開(kāi)發(fā)時(shí)使用。這種規(guī)范下,不但訪問(wèn)策略清晰易理解,更容易維護(hù)。也使你的架構(gòu)更為合理和現(xiàn)代化。

當(dāng)然,復(fù)雜的業(yè)務(wù)邏輯使得資源控制器還不僅僅這么使用,但當(dāng)你理解了這種最為基本的,其他的也不會(huì)太難。文檔中對(duì)控制器的其他部分做出相當(dāng)詳細(xì)的描寫(xiě),本著作為文檔的補(bǔ)充,這些文檔中已經(jīng)存在且足夠理解的,就不再?gòu)?fù)述。

我會(huì)在以后針對(duì)不足的地方補(bǔ)充。謝謝觀看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,828評(píng)論 18 139
  • 介紹 不要把所有處理請(qǐng)求的邏輯都放到一個(gè)單獨(dú)的 routes.php 文件里,我們可以使用控制器去組織這些行為。C...
    伊Summer閱讀 824評(píng)論 0 1
  • 本文轉(zhuǎn)自CSDN,在原作者基礎(chǔ)上將老版本laravel的目錄更正為最新laravel5.4目錄,去除了不太好理解的...
    小小奶狗閱讀 2,042評(píng)論 6 10
  • 0.1配置1.模板繼承2.控制器3.git4.支付寶支付的流程5.路由6.中間件7.請(qǐng)求8.laravel 學(xué)習(xí)筆...
    云龍789閱讀 827評(píng)論 0 5
  • 周一的上班天,我和往常一樣等著七點(diǎn)半的地鐵去上班,耳機(jī)里播放著周董的“彩虹”,在車?yán)锬弥謾C(jī)刷著朋友圈,使我...
    慢半拍小姐閱讀 510評(píng)論 0 0