原文地址: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ǔ)充。謝謝觀看。