本系列文章主要是方便初學 laravel 的人入門,幫一些朋友認識到如何入門、如何學習 laravel,同時補充一些忽略過的基礎(chǔ)知識。
Laravel 給了我學習新知識的一個契機,讓我更早的接觸更多的東西。我現(xiàn)在這個博客就是用 laravel 編寫的。
剛學習 laravel 其實是一個痛苦的過程,不過痛苦過后,世界大不一樣。原因就是造成痛苦的,不是 laravel 難,而是思想的陳舊帶來的。laravel 本身也沒有運用什么超前的理念,但即使是炒的舊飯,也比餿了的來得美味一些。既然舊飯要炒一下,那就得費點小小的力氣。剩飯也香啊,尤其是撒了蔥花之后!
學得越多,就應(yīng)該記下來,這一系列筆記,也希望能夠幫助大家。
由于網(wǎng)絡(luò)上已經(jīng)將 laravel 的安裝步驟說的足夠詳細,本人也是通過這些方式安裝的,沒有什么特殊之處。關(guān)于安裝就不在本內(nèi)容中討論,但我會在另一篇文章內(nèi)講述 composer 相關(guān)的內(nèi)容的時候,聊一聊這一部分。
好了開始吧。
聲明
第一篇文章我不打算將重心直接帶到框架的使用上,而是讓讀者有一個清晰的概念。很多在 laravel 上的疑惑無非是安裝上的問題、功能函數(shù)或?qū)ο蠓椒ㄉ系膯栴},最后就是糾結(jié)框架結(jié)構(gòu)布局和一些php基礎(chǔ)知識上的。為了便于展開,我會著重在本文講述一些與 laravel 相關(guān)的基礎(chǔ)內(nèi)容,這不但對于梳理整個框架體系有著很大的幫助,更多的是為了理解一種思想,這種思想不但適用于 laravel,更適合平時項目的開發(fā)。由于我個人也在不斷學習之中,本篇文章會不斷更新。本文除了文字講述,也盡量帶來一些實例。在網(wǎng)絡(luò)上現(xiàn)有的資源存在的情況下,本人會在文章內(nèi)簡要提出并給出鏈接,以便各位按需獲得想要的。
正文
laravel是一個當下比較流行的框架,其主要特色個人認為包括以下:
- 簡潔而清晰地路由定義方式
- 強大的IoC容器
- 合理的框架結(jié)構(gòu)
- 豐富的第三方庫
入門很簡單
只要理清 laravel 上述的特色,基本上對laravel了解的差不多了,就算是入門了。這前三樣特色也恰好是 laravel 優(yōu)雅的保證。其實 laravel 主要要學習的也就這么多。所以,為什么會很難? laravel 真的很簡單,也許只是沒有找對方向,對嗎?肯定是的。
我目前所了解的,包括發(fā)生在我自己身上的,為什么覺得有時候 laravel 很難入門:思想、思路太過于陳舊。思想陳舊不算是貶義詞,就好比你不可以說一個跟不上時代的人不如別人。但這種“舊”思想確實不適合 laravel 這種運用相對于舊思想而言的新框架。那么哪些人容易在 laravel 上犯難?
- 沒有認認真真(再次強調(diào),是認認真真)看文檔的(占比至少97%)
- php 基礎(chǔ)不扎實的
- 不熟悉面向?qū)ο缶幊痰?/li>
- 不熟悉面向接口編程的
- 不知匿名函數(shù)為何物的
- 不熟悉反射的
- 不喜歡命名空間的
- 不喜歡研究設(shè)計模式的
- 使用 php5.4 以前版本的或不喜歡運用新特性的
- 沒用過 composer
- 不熟悉 PSR 規(guī)范
上述內(nèi)容不具備絕對代表性。不過確實在 laravel 學習上犯難的,大都存在上述因素。不幸的是,最開始我基本全部滿足上述條件,不幸的成為了學習 laravel 最艱難的那批人。但幸運的是,我很喜歡php,為了搞懂 laravel,照貓畫虎,模仿著去實現(xiàn) laravel 的功能。就是在這樣一個過程里,我慢慢了解了 laravel 其實并不像想象中的那般高大上,無非只是用了 php 最為普通的一些東西。但成功必有其高明之處,laravel 將 php 的特性發(fā)揮到了極致,使得 laravel 的某一些境界變得比其他框架更高。雖然其他優(yōu)秀的框架不在少數(shù),但我認為,laravel 這個框架雖然整體不能夠算是最好,但至少在設(shè)計思想上已經(jīng)將許多(特別注明,不是全部)框架狠狠地拉在了身后。
要學好 laravel,至少要學會做一件事:看文檔。大多數(shù)人覺得入門難或不知如何入門,請老老實實看文檔吧。
很多人說,laravel 文檔真的很渣啊,但實際上,你只是要上手使用,用 laravel 開發(fā)一個博客級別的小型應(yīng)用,這個作為入門的文檔算是超級詳盡的了。并不是站著說話不腰疼,因為我也吐槽過。但在某一天百般無聊之下通讀了整個文檔,發(fā)現(xiàn)之前我所遇到的問題其實都寫在過文檔上。
吐槽laravel文檔的重心不應(yīng)該是不詳盡,而應(yīng)該是,太凌亂
laravel 的文檔凌亂才是大問題,雖然看得出 laravel 文檔的結(jié)構(gòu)安排的初衷是為了減少冗余的文字,但這點卻讓像我這種被慣壞了的用戶犯了大難。往往看似應(yīng)該在這一部分出現(xiàn)的內(nèi)容卻在另一篇文檔內(nèi),這種安排不算奇葩也算是坑爹了。不得不承認,這樣子的安排減少了不必要的文字,但卻對初學者不友好。
這種情況舉個例子:定義控制器是 Route::controller(),按照常理這應(yīng)該和路由部分有個交集,但在控制器介紹部分只字未提,極其容易和原本的路由定義搞混淆,因為他們都用了 Route 類。這只是一個典型。在數(shù)據(jù)庫一塊也常常出現(xiàn)類似問題,甚至更為嚴重。
但是,即使如此凌亂,也不應(yīng)該成為不去讀文檔的理由。學習任何一個框架,都應(yīng)該仔細閱讀其文檔。其實到最后才發(fā)現(xiàn),原來 laravel 文檔的安排對于熟悉的開發(fā)者而言,反而是很科學的,因為其歸類非常明確,省去了不必要的文字感染,讓你專注于這一個問題點上。所以,不要認為文檔不詳細,其實文檔做的已經(jīng)夠多了。要知道,文檔是為了讓你能夠上手使用,并不是完完全全讓你徹底學透的,如果想要了解更多 laravel 的細節(jié)和功能,我認為應(yīng)該去讀一讀 Laravel 的 API 文檔和一部分的Symfony文檔。如果愿意,閱讀不同組件的源代碼效果更好,有時候你會產(chǎn)生一種源代碼比文檔更清晰的錯覺 !
。
PHP的基礎(chǔ)也很重要
無論用什么框架,都不要忘了這都是在做 php 開發(fā),因此 php 的基礎(chǔ)非常重要??蚣苁亲尵幋a更為方便,提高效率的,并不是為了降低某些層面的難度。
很多人在基礎(chǔ)方面吃虧,卻將其歸咎于框架的錯,可能這些人和我最初一樣,沒意識到 laravel 是一個在 php5.4 基礎(chǔ)上開發(fā)的(新的 laravel 5.1 要求 php 5.5 以上),用到了很多特性。其中有一個重點就是命名空間和trait。命名空間很多人不喜歡,認為這是個很麻煩的事情,別忘了命名空間是從 php5.3 就有的了,最初這是為了解決重名和項目之間類的沖突的。到了現(xiàn)在,命名空間的存在使得項目與組件的代碼更容易規(guī)劃從而變得規(guī)范化,尤其是在自動加載的時候,這一部分參考 PSR-4 規(guī)范。命名空間的不熟悉會給學習 laravel 和一些新版本的框架帶來足夠多的麻煩。
想要了解 php 的命名空間不需要可以尋找教程,php 官方文檔非常詳盡。
除了命名空間,還有 trait,這是 php 5.4 以來的特性,適用于水平擴展類方法和功能的,通過 trait 可以更快的組裝一個方法,具體依舊參考 php 官方文檔,十分詳盡。
其實除了 trait 和命名空間,作為建立在面向?qū)ο缶幊趟枷胂碌目蚣?,尤其?yīng)當在整個開發(fā)中貫徹這一思想。而 php 的面向?qū)ο蠛?java、C# 還有 C++ 中有些地方有著不少的差異。
習慣了 php 的弱類型,有些人甚至不知道 php 可以實現(xiàn)類型約束:
1. class foo
2. {
3. public function __construct(Closure $config)
4. {
5. //
6. }
7. }
上述例子要求初始化時必須提供一個匿名函數(shù)作為參數(shù)。
重載、魔術(shù)方法、后期靜態(tài)綁定等等面向?qū)ο蟮幕A(chǔ)內(nèi)容,這都是學習 laravel 之前的必修課。當你遇到困難,很多時候會在這上面出的問題。
Composer 與 PSR 規(guī)范
很多人有些疑惑,如何在 laravel 內(nèi)使用自己的類? 很多人疑惑,一些文件應(yīng)當放在 laravel 的哪個目錄下? 也有很多人疑惑,為什么會提示某一些類無法加載?
問這些問題的主要有兩種人。一種是不了解 composer 的,一種是代碼里存在問題的。后者占主要部分,但我想來說說前者,因為一開始我是第一種。
雖然 Composer 不應(yīng)當是學習 php 和 laravel 的必須的,但既然被 laravel 所使用且 composer 被接受和普及已經(jīng)是大勢所趨,那就應(yīng)當對其至少有些許了解。composer 被創(chuàng)造的初衷是用來管理 php 依賴的。利用 composer 可以很快的引入第三方庫,且這些庫可以被直接使用。
不單單是 Laravel,實際上作為一個基于 Symfony 框架組件開發(fā)的框架,Symfony 這個框架更能感受到 Composer 利用的普遍,同時還有 Yii Framework 等主流的優(yōu)秀框架,這些無一不使用了 composer 作為組件的包管理器。
Composer 自帶的自動加載(autoload)機制是基于 PSR 規(guī)范的。因此非常有必要了解 PSR 規(guī)范,對于自動加載,僅需了解 PSR-4 即可,PSR-0 基本被淘汰。
由于利用好 composer 的自動加載,使得無論你的類庫和函數(shù)放在哪都能夠被加載。因此,如何在 laravel 中使用自己的類呢?很簡單,基本上我所了解的就以下兩種。
- 如果你的類庫是發(fā)布到某個版本控制系統(tǒng)上,可以通過 packagist.org 發(fā)布自己的包,然后通過 composer 的 require 引入即可。
- 如果你沒有使用 vcs 且僅僅只是在當前項目中創(chuàng)建的類的話,只需利用好 composer 的 autoload 即可。
Composer 實現(xiàn)庫和依賴的導(dǎo)入有很多種,Composer 的中文文檔也非常詳盡,不再浪費篇幅。但這一切都需要熟悉 PSR-4 規(guī)范(該規(guī)范很簡單,不要有芥蒂),其次就是一定要熟悉命名空間(namespace)。
同理,一些人疑惑,一些文件該放在 laravel 下的哪一個目錄?或者說,我這個文件可以放這里嗎?
這么說吧,理論上,放在哪都可以,只要是可以通過 composer 和 laravel 自帶的自動加載機制載入即可,且文件是在配置內(nèi)所設(shè)定的命名空間內(nèi)。如果加載時出現(xiàn)問題,可以通過 composer 命令dump-autoload 來解決,如果還有問題,需要檢查是否命名空間和配置出現(xiàn)問題。