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