鏈接:https://www.zhihu.com/question/27453375/answer/284721903
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
快速入門對Laravel是不合適的,因為它是為web工匠打造的工具。
第一,Composer與Laravel沒有直接的關系,這一點,已經有朋友回復了,composer是php中的一個自動加載包的工具,它只是一個接口,Laravel只是遵循了這個接口,沒有它,你直接從github里下載Laravel也沒有問題。這種類似的工具還有phpunit等。
第二,Laravel使用的服務容器才是它和其他包交互的真正方式,如果你需要一項服務,比如Eloquent 關系映射器,只需要在容器中注冊以后就能用了,這種調用第三方工具或插件的方法不是降低了靈活性,反而提高了靈活性,你需要什么就調用什么,真正的核心內容卻很精簡。
第三,大家遵循相同的接口並不是說大家造出來都是同樣的輪子,比如,類,接口,它們都有同樣的東西,但不能說它們都一樣。
第三,Laravel的安全性,如果樓主了解過Laravel的安全機制的話,Laravel對Post表單有csrf密碼保護機制,用戶注冊密碼也有相應自帶的加密機制,隨意去看一下Laravel的用戶注冊、認證等文檔或是代碼,應該可以發現Laravel的安全性是非常高的。
第四,開發速度,在通信行業中有這么一句話:“速度和效率是不可兼得的”,從某種程度上來說,使用框架的開發速度肯定比不是直接來一句echo語句那么高,這一點也同樣有人回答過;開發速度和效率的權衡取決你的項目大小和維護時間長度。
上面是針對樓主提出的問題做的答復,有人說Laravel難,還有人覺得Laravel是噱頭,但是還是忍不住想說說Laravel的種種優點:
1.測試方便,Laravel整合了phpunit的所有php測試,另外自己還有一些測試輔助方法,包括了單純使用phpunit下復雜的數據庫數據問題,laravel為測試提供了一些選項,能夠在不影響實際數據庫的情況下進行數據庫測試,另外還能直接對瀏覽器中的元素進行測試,如按鈕,鏈接等,可以說非常方便,laravel支持phpunit、數據庫測試、HTTP請求測試以及瀏覽器元素測試。
2.與Eloquent的強大的數據庫關系映射模型,在編寫網站的過程中,處理數據其實才是大頭,而Laravel使用了Eloquent,這意味着什么呢?如果你有一個用戶數據表User,還有一個文章數據表Post,你只需要在PostController中聲明一個user()方法,然后里面寫上$this->belongsTo(),這樣就把用戶與文章的一對多關系確立了,然后調用$post->user就可以獲得這篇文章的擁有用戶了,是不是很方便?這只是其中一個關系,對於各種復雜的數據庫,Eloqent都運行的很好。
3.tinker對php的調試功能,看到這里,你可能會說,php也有調試功能?這里的調試功能當然不是像在java或c++中一樣有斷點什么的,而是REPL(讀取-求值-輸出-循環),如果你熟悉python,這個應該很簡單,比如進入tinker,然后在命令行界面中,輸入echo ‘hello world',它就會立刻輸出hello world,當然這個功能很簡單,但是所有的其他php語句都可以在tinker中運行,甚至你可以定義變量。
4.工廠生成數據factory,這一點還是針對測試的,比如你在本地需要大量的user數據,那么你可以直接創造一個user factory,然后你直接輸入factory(user, 50)->create(),立馬就能生成50條數據到數據庫,當然你也可以使用make,這樣只生成數據而不保存到數據庫,並且Laravel允許你選擇生成數據的類型,比如單詞、句子、段落、數字等。
5.強大的blade視圖模版語言,在PHP中,可能會經常遇到要輸出同樣的form元素,或是error顯示錯誤等,可以把這些定義在一個文件中,比如error.blade.php,然后需要這個模版的時候只需要include(error)即可,這樣可以減少很多重復的代碼,而且blade支持傳遞變量,對於mvc模式來說,這個blade模版語言非常的方便。
6.強大的表單驗證功能,只需要編寫一個validation函數,Laravel會處理表單字段,比如你要限定某個input最少要6個字符並且必填,可以使用min:6|required來限定它,Laravel會自動處理它;這是php的常用功能。諸如此類針對常用功能的還有:分頁功能,在Laravel中極其簡單;閃存功能,可以保存用戶填寫的表單,如果出錯,會自動保存一次數據;郵件功能,用戶注冊經常要用的,Laravel支持它;等等我一下子記不起的其他優點。
7.就是它的artisan命令行功能,當你要創建一個數據模型,你可以使用php artisan make:model,當你要創建一個控制器,可以使用php artisan make:controller等等,還可以使用php artisan tinker來運行tinker,還可以使用php artisan magrite:rollback來回滾數據操作等。
8.講到這里,它使用migrate來管理數據庫難道不是一個非常亮的優點嗎?版本控制的數據庫,當你的數據出了問題,你隨時可以回滾,可以回到從前的數據,當增加了新的數據表,或是更新了數據庫,數據也不會丟失!
在講這些優點的時候,我甚至都不敢說它語言優美,代碼簡潔;Laravel因為這個已經被噴得太慘了,有人說語言優美有屁用,代碼簡潔又如何,總之它不容易上手。emmmm,我通常不去爭辯這些,因為這些人通常也不會學習英語,也不會重構代碼;Laravel對名詞的單復數做得非常好,如果會英語,一路讀過去應該沒什么障礙,它的鏈式語言確實很優美,這里我可以舉一個例子,(其實前面我舉例的函數大家應該感受到了),來一個查詢構造器:
$users = DB::table('users') ->whereColumn([ ['first_name', '=', 'last_name'], ['updated_at', '>', 'created_at'] ])->get();
我不說這段代碼什么意思,大家都能看懂。代碼簡潔的好處是,在你遇到問題的時候,可以一路追究到它的源代碼,並且沒有閱讀障礙。另外,據我估計,Laravel的源碼每個函數的代碼應該沒有超過20行,這有什么用?當你閱讀任何一個函數時都知道它在干什么!
至於Laravel本身的框架,有人說服務容器沒什么高級的,只不過是工廠模式加上一些其他的實現罷了,我不反駁,因為我還沒有去閱讀過Laravel核心的代碼,但是,很多偉大的事情本來就很簡單,就像約翰卡馬克說的那樣,“根據摩爾定律,某個時間點上要極其聰明的圖形程序員才能做出來的東西,若干年后,只要能力還可以的程序員就可以復制出來”。