
在開發(fā)應(yīng)用程序時(shí)選擇使用哪個(gè)框架,這將取決于很多因素。和其它任何應(yīng)用程序框架一樣,Laravel框架也有其優(yōu)缺點(diǎn)。撇開那些令人憎惡的缺點(diǎn)不談,這篇文章我們將把重點(diǎn)放在使用Laravel框架的優(yōu)點(diǎn)上。
我們開始討論Laravel的神奇之處,而不使用已有的框架,自己開發(fā)構(gòu)建一個(gè)應(yīng)用程序所需一切的潛在風(fēng)險(xiǎn)是什么?不使用框架來構(gòu)建應(yīng)用程序有什么問題?為了理解在不使用框架的情況下開發(fā)一個(gè)應(yīng)用程序的潛在風(fēng)險(xiǎn),讓我們假設(shè),我們必須構(gòu)建一個(gè)使用MVC(模型-視圖-控制器)架構(gòu)模式的應(yīng)用程序。
當(dāng)你開始設(shè)置架構(gòu)時(shí),我們需要根據(jù)應(yīng)用程序的結(jié)構(gòu),從很多種架構(gòu)模式中做出合適的選擇。當(dāng)我想到如果我自己需要開發(fā)一套完整的應(yīng)用程序體系架構(gòu)時(shí),我馬上想到了幾個(gè)問題。
首先,我應(yīng)該從應(yīng)用程序的哪個(gè)組件開始著手處理呢?是先安裝所有的第三方依賴項(xiàng)和庫嗎?從應(yīng)用程序的可擴(kuò)展性來考慮,我應(yīng)該使用什么樣的模型類(model class)庫來和數(shù)據(jù)庫進(jìn)行交互?是使用PDO類呢,還是有更好的選擇?
我將如何管理依賴注入?考慮到后期會(huì)有更多的開發(fā)人員在同一個(gè)應(yīng)用程序上工作,我應(yīng)該如何對(duì)這個(gè)體系結(jié)構(gòu)做一個(gè)完整的記錄?
這些問題看起來很難回答,但是我想告訴你這些僅僅是個(gè)開始。
很明顯,如果你不是一個(gè)熟悉MVC體系架構(gòu)的編程者,那么這些問題本身對(duì)你來說都是新問題。如果你以前沒有使用過任何框架,你可能從來沒有問過這些問題。如果是這樣的話,那么這個(gè)理由本身就足以讓你采用Laravel框架進(jìn)行應(yīng)用程序開發(fā)。
Laravel框架將為你處理所有這些低級(jí)的細(xì)節(jié),并為你提供一個(gè)簡(jiǎn)潔和實(shí)用的架構(gòu)模式。同時(shí),Laravel框架將為你處理模型、視圖和控制器之間的無縫交互。
并且還將為你提供許多內(nèi)置在框架中的不同功能,以便你可以專注于編寫應(yīng)用程序的業(yè)務(wù)邏輯。
最終,你因?yàn)椴槐鼗ㄙM(fèi)時(shí)間尋找這些低級(jí)問題的解決方法,而節(jié)省大量的時(shí)間和精力。
框架提供了一致性和靈活性讓我們?cè)囍胂笠幌逻@樣一種情形:你正在開發(fā)一個(gè)龐大的應(yīng)用程序,但是沒有使用任何現(xiàn)成的框架或者使用自己構(gòu)建的框架。當(dāng)用戶數(shù)量增加或需要添加更多功能時(shí),你將需要更多的開發(fā)人員來開發(fā)和維護(hù)這個(gè)應(yīng)用程序。
在新開發(fā)人員入職期間,你除了向他們介紹你的開發(fā)團(tuán)隊(duì)需要遵循的軟件開發(fā)的所有流程步驟和方法之外,你還必須向他們講解你所構(gòu)建的整個(gè)應(yīng)用程序結(jié)構(gòu)。由于這個(gè)原因,新的開發(fā)人員必須通過一個(gè)高的學(xué)習(xí)曲線來理解你開發(fā)的新體系結(jié)構(gòu)。
但是如果你使用Laravel框架,這類問題將不復(fù)存在,因?yàn)檫@個(gè)框架會(huì)帶給你應(yīng)用程序開發(fā)的一致性。Laravel框架有詳細(xì)的文檔,新開發(fā)人員不必經(jīng)歷使用新框架的學(xué)習(xí)過程。
因?yàn)槟憧梢院苋菀椎仄刚?qǐng)到一個(gè)熟悉Laravel框架的開發(fā)人員,并能讓他很快開始工作。當(dāng)一個(gè)團(tuán)隊(duì)使用標(biāo)準(zhǔn)化框架(比如Laravel)來構(gòu)建應(yīng)用程序時(shí),向團(tuán)隊(duì)中添加其他開發(fā)人員就會(huì)變得很容易。
這是因?yàn)椋寒?dāng)你雇傭了一個(gè)熟悉Laravel框架的開發(fā)人員,他能夠理解這些代碼,因?yàn)樗写a都遵循相同的模式。
使用Laravel框架的好處如果上面這些聽起來已經(jīng)很有趣,并且足以鼓勵(lì)你在你開發(fā)下一個(gè)應(yīng)用程序時(shí)使用框架,那么接下來讓我分享一下Laravel框架相對(duì)于其它PHP框架所具有的一些優(yōu)勢(shì)。
這些優(yōu)勢(shì)無疑使Laravel框架成為最佳PHP框架的主要競(jìng)爭(zhēng)者之一。

1.開箱即用的用戶身份驗(yàn)證Laravel框架提供了開箱即用的用戶身份驗(yàn)證功能。
任何現(xiàn)代的web應(yīng)用程序都需要用戶身份驗(yàn)證,使用Laravel框架,你幾乎不需要做任何事情就可以將它設(shè)置好。
當(dāng)你設(shè)置用戶身份驗(yàn)證時(shí),Laravel框架會(huì)創(chuàng)建所有重要的組件,如用戶模型、注冊(cè)和登錄控制器,以及相應(yīng)的視圖。
而且在將來,根據(jù)應(yīng)用程序所需的業(yè)務(wù)邏輯,將這些組件擴(kuò)展到新添加的功能上也是非常容易的。
除此之外,Laravel框架還提供了Socialite package(擴(kuò)展包),它使你的應(yīng)用程序能夠使用各種社交網(wǎng)絡(luò)(如Facebook, Google Plus和Twitter)對(duì)用戶進(jìn)行身份驗(yàn)證。
要使它工作正常,你只需進(jìn)行最低限度的配置。
2. 約定優(yōu)于配置(也稱作按約定編程)Laravel框架同樣采用“約定優(yōu)于配置”的方法。
這基本上意味著,如果遵循了不同組件的命名約定,就幾乎不必關(guān)注配置工作。
如果你遵循了命名約定,Laravel框架自身就會(huì)幫你處理許多低級(jí)的細(xì)節(jié),而且一切都會(huì)神奇地開始工作。
如果你一直使用傳統(tǒng)的PHP編程,這在一開始可能會(huì)讓您感到難以忍受。
但一旦你嘗到了甜頭,你就再也不想回頭了。
3.輕松使用的電子郵件功能很難想象一個(gè)現(xiàn)代的應(yīng)用程序會(huì)沒有電子郵件功能。
使用Laravel框架,實(shí)現(xiàn)電子郵件發(fā)送功能非常容易。
除了SMTP和Php郵件功能外,Laravel框架還支持各種各樣的電子郵件通知服務(wù),如Mailgun,Mandrill,SparkPost,Amazon SES,SendMail等等。
這些服務(wù)可以使你能夠快速開始通過本地或基于云的服務(wù)發(fā)送郵件。
你還可以使用Nexmo通過Slack和SMS發(fā)送通知。
所有這些服務(wù)在Laravel框架中都是開箱即用的。
Laravel框架還在電子郵件模板中支持Markdown
(譯者注:Markdown是一個(gè)文本到HTML(text-to-HTML)的轉(zhuǎn)換工具),
它能夠使你在很少的時(shí)間內(nèi)完成電子郵件的創(chuàng)建工作。
4.Artisan命令
對(duì)我個(gè)人而言,Artisan命令行是Laravel框架提供的最簡(jiǎn)練和最有用的功能。
Artisan是Laravel框架的命令行接口,它幫助開發(fā)人員使用命令行本身自動(dòng)化許多任務(wù)。
Artisan命令可以在應(yīng)用程序本身中使用,開發(fā)人員也可以創(chuàng)建額外的Artisan命令。
你能夠想到的所有常見任務(wù),都能找到一個(gè)Artisan命令與之對(duì)應(yīng)。
例如,創(chuàng)建一個(gè)模型、創(chuàng)建一個(gè)控制器、創(chuàng)建一個(gè)數(shù)據(jù)庫種子、遷移數(shù)據(jù)庫等等。
這個(gè)列表是無窮無盡的。
我之所以說它“簡(jiǎn)練”,是因?yàn)槟闼龅木褪莻鬟f命令,剩下的工作全交給Laravel框架來處理。
5.“測(cè)試驅(qū)動(dòng)開發(fā)”
“測(cè)試驅(qū)動(dòng)開發(fā)”的測(cè)試自動(dòng)化Laravel框架自帶對(duì)PHPUnit的支持,使得采用“測(cè)試驅(qū)動(dòng)開發(fā)”模式的PHP應(yīng)用程序的測(cè)試變得非常容易。
為應(yīng)用程序編寫單元測(cè)試變得很簡(jiǎn)單,而且確保事情按照你希望的方式進(jìn)行。
6.簡(jiǎn)潔的依賴注入
一旦你開始使用Laravel框架工作,你很快就會(huì)意識(shí)到Laravel框架是從Ruby on Rails和更多的函數(shù)式語言中獲得的靈感,而不是從Java。
這一點(diǎn)從Laravel框架處理依賴注入的方式就可以輕易地看出這一點(diǎn)。
盡管實(shí)現(xiàn)依賴注入可以采取復(fù)雜的模式,但Laravel框架采取的做法與之相反,它提供了創(chuàng)建全局助手函數(shù)的簡(jiǎn)單方法。
借助于全局函數(shù)和Faade靜態(tài)代理,我們就可以在任何需要的地方輕松地實(shí)現(xiàn)依賴注入。
7.業(yè)務(wù)邏輯和顯示代碼的分離
Laravel遵循模型-視圖-控制器(MVC)架構(gòu)模式,將業(yè)務(wù)邏輯與視圖分離。
這種方法有很多優(yōu)點(diǎn)。
而要真正了解它優(yōu)點(diǎn),你需要了解什么是MVC模式,以及你的應(yīng)用程序是否需要這樣的體系架構(gòu)。
8. Eloquent ORM
Eloquent ORM(對(duì)象關(guān)系映射)實(shí)現(xiàn)Eloquent是Laravel提供的ORM(對(duì)象關(guān)系映射)實(shí)現(xiàn)。
Eloquent使得從數(shù)據(jù)庫中獲取數(shù)據(jù)變得非常容易。
創(chuàng)建表之間的關(guān)系并從這些表中獲取數(shù)據(jù)也變得很簡(jiǎn)單。
Eloquent還允許你在表中創(chuàng)建各種連接,并提供許多幫助函數(shù),使與數(shù)據(jù)庫的交互變得非常簡(jiǎn)單。
你幾乎不必編寫SQL查詢語句或函數(shù)。
因?yàn)橛辛薊loquent ORM,Laravel框架就可以為下面這些數(shù)據(jù)庫提供開箱即用的支持:MySQLPostgreSQLSQLiteSQL Server你真是說對(duì)了,這基本上意味著只要你使用Eloquent,你就不必?fù)?dān)心與上述任何數(shù)據(jù)庫的兼容性。
從一個(gè)數(shù)據(jù)庫切換到另一個(gè)數(shù)據(jù)庫也非常容易。
現(xiàn)在試著想象一下這給你的應(yīng)用程序帶來的可擴(kuò)展性,不妨讓我用一個(gè)例子來解釋這一點(diǎn)。
假設(shè)你有一個(gè)應(yīng)用程序,這個(gè)應(yīng)用程序在開始時(shí)有一個(gè)很小的用戶群。由于用戶數(shù)量較小且應(yīng)用程序處于初始階段,因此你決定使用MySQL作為數(shù)據(jù)庫。一段時(shí)間過后,你的應(yīng)用程序的用戶數(shù)量增長(zhǎng)到了相當(dāng)高的級(jí)別,現(xiàn)在你可能需要切換到SQL Server數(shù)據(jù)庫。因?yàn)槭褂昧薊loquent,這個(gè)切換現(xiàn)在變得非常簡(jiǎn)單,就像更改Laravel框架中的特定配置詳細(xì)信息一樣容易。
9.隊(duì)列(Queue)和調(diào)度器(Scheduler)
在開發(fā)應(yīng)用程序時(shí),通常會(huì)有一些耗時(shí)的任務(wù)。
這些任務(wù)需要推遲到稍后的時(shí)間執(zhí)行,這樣它們就不會(huì)給用戶的流程造成阻塞。
這類任務(wù)的一個(gè)完美例子可能是生成一個(gè)統(tǒng)計(jì)用戶請(qǐng)求創(chuàng)建CSV文件的PDF報(bào)告。Laravel框架的隊(duì)列服務(wù)提供了一個(gè)統(tǒng)一的API,用于將這些任務(wù)推遲到應(yīng)用程序的稍后時(shí)間處理。
談到Laravel框架的命令調(diào)度器,它是那些繁瑣的定時(shí)任務(wù)(Cronjob)的完美替代品。
在很多時(shí)候,開發(fā)人員必須為特定的任務(wù)設(shè)置定時(shí)作業(yè)。
這種任務(wù)的一個(gè)完美例子是向所有訂閱用戶發(fā)送他們訂閱的每周簡(jiǎn)訊(Newsletter)。
為了設(shè)置這個(gè)定時(shí)作業(yè),開發(fā)人員必須使用SSH命令登錄到服務(wù)器并在操作系統(tǒng)級(jí)別設(shè)置這個(gè)定時(shí)作業(yè)。
這在一段時(shí)間內(nèi)會(huì)成為一個(gè)麻煩,因?yàn)檫@些定時(shí)作業(yè)不能成為GIT和其它版本控制系統(tǒng)管理的一部分。
但是Laravel框架的命令調(diào)度器使用內(nèi)置函數(shù)提供了一個(gè)干凈的API來調(diào)度各種各樣的任務(wù)。
這樣,你就不必使用SSH命令登錄到服務(wù)器的終端,并且所有這些被調(diào)度的作業(yè)都成為代碼的一部分而納入版本控制系統(tǒng)管理的范圍。
10.簡(jiǎn)潔的路由Laravel框架處理路由的方式簡(jiǎn)單直觀。
有一個(gè)單一的web.php文件來處理所有的web路由。
如果某些路由需要公共中間件,它們可以很容易地在Laravel中分組。
路由的一個(gè)完美的應(yīng)用場(chǎng)景是:應(yīng)用程序中的某些頁面,在用戶可以查看它們之前,這些頁面需要用戶身份驗(yàn)證。
Laravel框架可以將所有這些頁面分組,并且經(jīng)過Auth中間件檢查,以確保只有登錄到系統(tǒng)的用戶才能查看這些頁面。
Laravel框架還提供了一個(gè)簡(jiǎn)潔的路由模型綁定(route model binding),其中模型(model)可以綁定到路由。
有了這個(gè)幫助,視圖可以直接從路由本身返回,甚至不需要訪問控制器。
11. Composer管理依賴關(guān)系Laravel框架使用Composer管理依賴關(guān)系和自動(dòng)加載。
Composer可以幫助你安裝Laravel擴(kuò)展包,這使得依賴管理變得輕而易舉。
在任何時(shí)候,你都可以檢查package.json文件來查看你的應(yīng)用程序正在使用的所有依賴項(xiàng)。
Composer還讓你能夠使用單個(gè)Composer命令更新依賴項(xiàng)。
12.Blade模板引擎Blade是Laravel框架的模板引擎。
Blade可以讓你在分離視圖和業(yè)務(wù)邏輯上領(lǐng)先一步。
它能讓你的視圖代碼保持非常干凈。
一旦你對(duì)MVC架構(gòu)模式和Laravel對(duì)它的實(shí)現(xiàn)有了清楚的了解,你就會(huì)更加清楚地認(rèn)識(shí)到Blade模板引擎的重要性。
Blade還提供了模板繼承,因此你可以將最近使用的模板劃分為多個(gè)部分,并讓其它視圖文件繼承這些部分。
有了Blade的幫助,你就可以創(chuàng)建一些邏輯較小的視圖部分,然后可以包含這些小的部分以形成完整的視圖。
13.文檔這是一個(gè)有點(diǎn)灰色的區(qū)域。
當(dāng)我最初開始使用Laravel框架的時(shí)候,我在查找文檔時(shí)確實(shí)遇到了問題。
當(dāng)時(shí)所有的一切都沒有文檔,但是在某個(gè)時(shí)刻我突然發(fā)現(xiàn)有些事情開始神奇地工作,那就是大家始遵循命名規(guī)范的那個(gè)時(shí)刻。
現(xiàn)在,有一些API文檔列出了Laravel框架中聲明的每個(gè)類和方法。
一旦你掌握了如何使用它,并且知道如何使用Laravel文檔來為你的利益服務(wù),我保證你不會(huì)再有任何抱怨。
14.活躍社區(qū)Laravel確實(shí)有一個(gè)活躍的社區(qū)。
當(dāng)你遇到任何問題時(shí),你都可以搜索,而且肯定會(huì)查到許多針對(duì)你的問題的帖子。
社區(qū)交流非常強(qiáng)大,公眾號(hào)每天更新技術(shù)文章和最新咨詢。
我認(rèn)為這些優(yōu)勢(shì)足以讓你對(duì)Laravel框架感到興奮。
盡管把它定義為完美肯定是夸大其詞了,但我可以肯定的是,Laravel框架絕對(duì)是最好的PHP框架之一。
