[TOC]
### **關注文檔→[進群一起學習提升吧](https://jq.qq.com/?_wv=1027&k=5dpB2jL)**
## **默認條件**
你應該懂得 PHP 網站運行的基礎知識,并且擁有一個完善的開發環境。跟隨本教程走完一遍,你將會得到一個基礎的包含登錄、后臺編輯、前臺評論的簡單 blog 系統。
### **Tips**
1. 環境要求:PHP 7.0+,MySQL 5.1+
2. 本教程不推薦完全不懂 PHP 與 MVC 編程的人學習,Laravel 的學習曲線不僅僅是陡峭,而且耗時很長,請先做好心理準備。
3. 這不是 “一步一步跟我做” 教程。本教程需要你付出一定的心智去解決一些或大或小的隱藏任務,以達到真正理解 Laravel 運行邏輯的目的。
4. 我使用 Safari 截圖是為了好看,你們在開發時記得選擇 Chrome 哦~
## 開始學習
### **1\. 安裝**
許多人被攔在了學習 Laravel 的第一步:安裝。并不是因為安裝有多復雜,而是因為【眾所周知的原因】。在此我推薦一個 composer 全量中國鏡像:[http://pkg.phpcomposer.com](http://pkg.phpcomposer.com/)。啟用 Composer 鏡像服務作為本教程的第一項小作業請自行完成哦。
鏡像配置完成后,在終端(Terminal 或 CMD)里切換到你想要放置該網站的目錄下(如 C:\\wwwroot、/Library/WebServer/Documents/、/var/www/html、/etc/nginx/html 等),運行命令:
~~~shell
composer create-project laravel/laravel learnlaravel5 ^5.5
~~~
然后,稍等片刻,當前目錄下就會出現一個叫 learnlaravel5 的文件夾,安裝完成啦~
### **2\. 運行**
為了盡可能地減緩學習曲線,推薦大家使用 PHP 內置 web server 驅動我們的網站。運行以下命令:
~~~shell
cd learnlaravel5/public
php -S 0.0.0.0:1024
~~~
這時候訪問`http://127.0.0.1:1024`就是這個樣子的:
[](https://camo.githubusercontent.com/07d7087f77700bd9330ad493be937f9e02cc92e0/687474703a2f2f716e2e6c7677656e68616e2e636f6d2f323031372d30392d30362d31353034363031303136353339382e6a70673f743d32)
我在本地 hosts 中綁定了 fuck.io 到 127.0.0.1,所以截圖中我的域名是 fuck.io 而不是 127.0.0.1,其實他們是完全等價的。跟過去幾年比,有一件大快人心的大好事,`fonts.googleapis.com`網站已經轉移到了墻內,不會再“白屏”了。
至于為什么選擇 1024 端口?因為他是 \*UNIX 系統動態端口的開始,是我們不需要 root 權限就可以隨意監聽的數值最小的端口。
另外,如果你不熟悉 PHP 運行環境搭建的話不要輕易嘗試使用 Apache 或 Nginx 驅動 Laravel,特別是在開啟了 SELinux 的 Linux 系統上跑這倆貨。關于 Laravel 在 Linux 上部署的大坑,我可能要單寫一篇長文分享給寶寶們。(說了一年了也沒見寫呀)
### **3\. 體驗牛逼閃閃的 Auth 系統**
Laravel 利用 PHP5.4 的新特性[trait](http://php.net/manual/zh/language.oop5.traits.php)內置了非常完善好用的簡單用戶登錄注冊功能,適合一些不需要復雜用戶權限管理的系統,例如公司內部用的簡單管理系統。
激活這個功能非常容易,運行以下命令:
~~~html
php artisan make:auth
~~~
訪問`http://fuck.io:1024/login`,看到以下頁面:
[](https://camo.githubusercontent.com/a9d216fd47dcbb1bd3729fa5ecf38106f5f1ff7b/687474703a2f2f716e2e6c7677656e68616e2e636f6d2f323031372d30392d30362d31353034363031363333383633382e6a70673f743d31)
### **4\. 連接數據庫**
接下來我們要連接數據庫了,請自行準備好 MySQL 服務哦。
#### **a. 修改配置**
不出意外的話,learnlaravel5 目錄下已經有了一個 .env 文件,如果沒有,可以復制一份 .env.example 文件重命名成 .env,修改下面幾行的值:
~~~shell
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel5
DB_USERNAME=root
DB_PASSWORD=password
~~~
推薦新建一個名為 laravel5 的數據庫(編碼設置為 utf8mb4),并且使用 root 賬戶直接操作,降低學習數據庫的成本。
數據庫配置好之后,在登錄界面填寫任意郵箱和密碼,點擊 Login,你應該會得到以下畫面:
[](https://camo.githubusercontent.com/3373a697bd90199d76b632d1a0cc94ab427b0e39/687474703a2f2f716e2e6c7677656e68616e2e636f6d2f323031372d30392d30362d31353034363033373238383339322e6a70673f743d31)
它說 users 表不存在,接下來我們將見識 Laravel 另外一個實用特性。
> tip:如果你下載了我的示例代碼,默認是跑不起來的,還需要生成 .env,運行 composer update 填充 vendor 文件夾等操作,如果部署在 Linux 上,用的 Apache 或 Nginx,還需要設置文件夾權限:`chmod 777 -R storage bootstrap/cache`
#### **b. 進行數據庫遷移(migration)**
運行命令:
~~~shell
php artisan migrate
~~~
我們得到了如下結果:
~~~shell
? php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
~~~
數據庫遷移成功!趕快打開[http://fuck.io:1024/home](http://fuck.io:1024/home)點擊右上角的注冊按鈕注冊一個用戶試試吧~
下圖是本寶寶注冊了一個 username 為 1 用戶:
[](https://camo.githubusercontent.com/0289ae8e12890e81f314479f314fe459ffb5d592/687474703a2f2f716e2e6c7677656e68616e2e636f6d2f323031372d30392d30362d31353034363034303832383433312e6a7067)
#### **c. migration 是啥?**
打開`learnlaravel5/database/migrations/2014_10_12_000000_create_users_table.php`文件,你肯定能一眼看出它的作用:用 PHP 描述數據庫構造,并且使用命令行一次性部署所有數據庫結構。
### **5\. 使用 Laravel 的“葵花寶典”:Eloquent**
Eloquent 是 Laravel 的 ORM,是 Laravel 系統中最強大的地方,沒有之一。當初 Laravel 作者在開發第一版的時候花了整整三分之一的時間才搞出來 Eloquent。當然,“欲練此功,必先自宮”,Eloquent 也是 Laravel 中最慢的地方,迄今無法解決。(路由、自動載入、配置分散、視圖引發的性能問題都通過緩存幾乎徹底解決了,Composer Autoload 巨量的性能消耗也被 PHP7 手起刀落解決了)
當然,我們還是要承襲第一版教程中對 Eloquent ORM 的描述:鵝妹子英!
> 如果你想深入地了解 Eloquent,可以閱讀系列文章:[深入理解 Laravel Eloquent(一)——基本概念及用法](http://mp.weixin.qq.com/s?__biz=MzI0NjcxNDYzOQ==&mid=100000057&idx=1&sn=97ecaca16a6aba85ea269a41abb3fe70&chksm=69ba59595ecdd04f3a01e2851e0c580e490fe172e1618a745c0e8ee34f05796a025dda1dade0#rd)
#### **a. Eloquent 是什么**
Eloquent 是 Laravel 內置的 ORM 系統,我們的 Model 類將繼承自 Eloquent 提供的 Model 類,然后,就天生具備了數十個異常強大的函數,從此想干啥事兒都是一行代碼就搞定。
經過了三年多的大規模使用,我發現 Eloquent 另辟蹊徑采用和 Java 技術完全不同的思路解決了多人開發耦合過重的問題:數據庫相關操作全部用一句話解決,Model 中不寫共用函數,大幅降低了 bug 幾率。什么?你說性能?軟件工程研究的對象是人,性能的優先級比代碼格式規范都低好嘛。我時刻謹記:代碼是寫給人看的,只是恰好能運行。
#### **b. 怎么用?**
我們使用 Artisan 工具新建 Model 類及其附屬的 Migration 和 Seeder(數據填充)類。
運行以下命令:
~~~shell
php artisan make:model Article
~~~
去看看你的 app 目錄,下面是不是多了一個 Article.php 文件?那就是 Artisan 幫我們生成的 Model 文件:
~~~html
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
//
}
~~~
如此簡潔有力的代碼,隱藏了背后極高的難度和巨大的復雜度,讓我們閉上眼睛,靜靜地感受 Laravel 的優雅吧 (~ ̄▽ ̄)~
### **下面是幾個簡單的例子:**
#### **找到 id 為 2 的文章打印其標題**
~~~html
$article = Article::find(2);
echo $article->title;
~~~
#### **查找標題為“我是標題”的文章,并打印 id**
~~~html
$article = Article::where('title', '我是標題')->first();
echo $article->id;
~~~
#### **查詢出所有文章并循環打印出所有標題**
~~~html
$articles = Article::all(); // 此處得到的 $articles 是一個對象集合,可以在后面加上 '->toArray()' 變成多維數組。
foreach ($articles as $article) {
echo $article->title;
}
~~~
#### **查找 id 在 10~20 之間的所有文章并打印所有標題**
~~~html
$articles = Article::where('id', '>', 10)->where('id', '<', 20)->get();
foreach ($articles as $article) {
echo $article->title;
}
~~~
#### **查詢出所有文章并循環打印出所有標題,按照 updated\_at 倒序排序**
~~~html
$articles = Article::where('id', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();
foreach ($articles as $article) {
echo $article->title;
}
~~~
### **6\. 使用 Migration 和 Seeder**
接下來我們生成對應 Article 這個 Model 的 Migration 和 Seeder。
#### **a. 使用 artisan 生成 Migration**
在 learnlaravel5 目錄下運行命令:
~~~shell
php artisan make:migration create_articles_table
~~~
成功之后打開`learnlaravel5/database/migrations`,你會發現有一個名為 2\*\*\*\*\*\_create\_articles\_table 的文件被創建了。我們修改他的 up 函數為:
~~~html
public function up()
{
Schema::create('articles', function (Blueprint $table)
{
$table->increments('id');
$table->string('title');
$table->text('body')->nullable();
$table->integer('user_id');
$table->timestamps();
});
}
~~~
這幾行代碼描述的是 Article 對應的數據庫中那張表的結構。Laravel Model 默認的表名是這個英文單詞的復數形式,在這里,就是 articles。接下來讓我們把 PHP 代碼變成真實的 MySQL 中的數據表,運行命令:
~~~shell
php artisan migrate
~~~
執行成功后,articles 表已經出現在數據庫里了:
[](https://camo.githubusercontent.com/5a5c552f1195a9251cd6b525c6a27ff78a288ba0/687474703a2f2f716e2e6c7677656e68616e2e636f6d2f323031372d30392d30362d31353034373031393633343333322e6a7067)
上圖中的軟件叫 Sequel Pro,是一個開源的 MAC 下 MySQL GUI 管理工具,超好用,推薦給用 MAC 的同學。
#### **b. 使用 artisan 生成 Seeder**
Seeder 是我們接觸到的一個新概念,字面意思為播種機。Seeder 解決的是我們在開發 web 應用的時候,需要手動向數據庫中填入假數據的繁瑣低效問題。
運行以下命令創建 Seeder 文件:
~~~shell
php artisan make:seeder ArticleSeeder
~~~
我們會發現`learnlaravel5/database/seeds`里多了一個文件`ArticleSeeder.php`,修改此文件中的 run 函數為:
~~~html
public function run()
{
DB::table('articles')->delete();
for ($i=0; $i < 10; $i++) {
\App\Article::create([
'title' => 'Title '.$i,
'body' => 'Body '.$i,
'user_id' => 1,
]);
}
}
~~~
上面代碼中的`\App\Article`為命名空間絕對引用。如果你對命名空間還不熟悉,可以讀一下[《PHP 命名空間 解惑》](http://mp.weixin.qq.com/s?__biz=MzI0NjcxNDYzOQ==&mid=100000064&idx=1&sn=7a7c7e390a9f7719b8175a660ef890d6&chksm=69ba59205ecdd0362448e75201eba4454c85bfb916308d01289eb9729ef11b0f0cc21db0dedd#rd),很容易理解的。
接下來我們把 ArticleSeeder 注冊到系統內。修改`learnlaravel5/database/seeds/DatabaseSeeder.php`中的 run 函數為:
~~~html
public function run()
{
$this->call(ArticleSeeder::class);
}
~~~
由于 database 目錄沒有像 app 目錄那樣被 composer 注冊為 psr-4 自動加載,采用的是[psr-0 classmap 方式](https://github.com/johnlui/Learn-Laravel-5/blob/laravel5.2/composer.json#L19-L21),所以我們還需要運行以下命令把`ArticleSeeder.php`加入自動加載系統,避免找不到類的錯誤:
~~~shell
composer dump-autoload
~~~
然后執行 seed:
~~~shell
php artisan db:seed
~~~
你應該得到如下結果:
~~~html
? php artisan db:seed
Seeding: ArticleSeeder
~~~
**這時候刷新一下數據庫中的 articles 表,會發現已經被插入了 10 行假數據:**
[](https://camo.githubusercontent.com/d90595c15cd86dba97b53e9021d2d2df638dec1e/687474703a2f2f716e2e6c7677656e68616e2e636f6d2f323031372d30392d30362d31353034373031393136393935352e6a70673f743d34)