1、簡介
快速 入門指南 會對Laravel架構做一個基本介紹,包括資料庫遷移、Eloquent ORM、路由、 驗證 、 視圖 以及Blade模板等等。如果你是個Laravel新手甚至之前對PHP架構也很陌生,那麼這裡將會成為你的良好起點。如果你已經使用過Laravel擷取其它PHP架構,可以考慮跳轉到進階指南(翻譯中)。
為了示範Laravel特性的基本使用,我們將將會構建一個簡單的、用於追蹤所有要完成任務的工作清單(To-Do List),本教程完整的代碼已經公開在Github上: https://github.com/laravel/quickstart-basic 。
2、安裝
安裝Laravel
當然,開始之前你首先要做的是安裝一個新的Laravel應用。你可以使用Homestead虛擬機器或者本地PHP開發環境來運行應用。設定好開發環境後,可以使用如下Composer命令安裝應用:
composer create-project laravel/laravel quickstart --prefer-dist
安裝Quickstart項目
當然你還可以通過複製GitHub倉庫到本地來安裝:
git clone https://github.com/laravel/quickstart-basic quickstartcd quickstartcomposer installphp artisan migrate
如果你還不瞭解如何構建本地開發環境,可參考Homestead和 安裝 文檔 。
3、準備好資料庫
3.1 資料庫遷移
首先,讓我們使用遷移來定義資料表用於處理所有任務。Laravel的資料庫遷移特性提供了一個簡單的方式來對資料表結構進行定義和修改:不需要讓團隊的每個成員添加列到本機資料庫,只需要簡單運行你提交到源碼控制中的遷移即可實現資料表建立及修改。
那麼,讓我們來建立這個處理所有任務的資料表吧。Artisan命令可以用來產生多種類從而節省重複的勞動,在本例中,我們使用 make:migration 命令產生 tasks 對應的資料表遷移:
php artisan make:migration create_tasks_table --create=tasks
該命令產生的遷移檔案位於項目根目錄下的 database/migrations 目錄,可能你已經注意到了, make:migration 命令已經在遷移檔案中為我們添加了自增ID和時間戳記,接下來我們要編輯該檔案添加更多的列到資料表 tasks :
increments('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('tasks'); }}
要運行遷移,可以使用Artisan命令 migrate 。如果你使用的是Homestead,應該在虛擬機器中運行該命令:
php artisan migrate
該命令會為我們建立遷移檔案中定義的所有資料表,如果你使用資料庫用戶端軟體查看資料庫,可以看到已經建立了一個新的 tasks 表,其中包含了我們在遷移中定義的列。接下來,我們準備為這個資料表定義一個Eloquent ORM模型。
3.2 Eloquent模型
Laravel使用的預設ORM是Eloquent,Eloquent使用模型讓資料存取變得簡單和輕鬆,通常,每一個Eloquent模型都有一個與之對應的資料表。
所以我們要定義一個與剛剛建立的 tasks 表對應的 Task 模型,同樣我們使用Artisan命令來產生這個模型:
php artisan make:model Task
該模型類位於 app 目錄下,預設情況下,模型類是空的,我們不需要告訴該Eloquent模型對應哪張資料表,這一點我們在Eloquent 文檔中提及過,這裡預設對應的資料表是 tasks ,下面是這個空的模型類:
瞭解更多關於Eloquent模型類的細節,可查看完整的Eloquent文檔。
4、路由
4.1 路由存根
下面我們需要為應用定義一些路由,路由的作用是在使用者訪問指定頁面時將頁面URL匹配到被執行的控制器或匿名函數。預設情況下,所有的Laravel路由都定義在 app/Http/routes.php 。
在本應用中,我們需要至少三個路由:顯示所有任務的路由,添加新任務的路由,以及刪除已存在任務的路由。接下來,讓我們在 app/Http/routes.php 檔案中建立這三個路由:
4.2 顯示視圖
接下來,我們來填充 / 路由,在這個路由中,我們要渲染一個HTML模板,該模板包含添加新任務的表單,以及顯示工作清單。
在Laravel中,所有的HTML模板都存放在 resources/views 目錄下,我們可以使用 view 函數從路由中返回其中一個模板:
Route::get(‘/’, function () {
return view(‘tasks’);
});
傳遞tasks到view函數將會建立一個對應視圖模板為 resources/views/tasks.blade.php的View對象。接下來我們需要去建立這個視圖檔案。
5、建立布局&視圖
本應用為了簡單處理只包含一個視圖,其中包含了添加新任務的表單和所有任務的列表。為了讓大家有一個直觀的視覺效果,我們貼出該視圖的,可以看到我們在視圖中使用了基本的Bootstrap CSS樣式:
5.1 定義布局
幾乎所有的web應用都是在不同頁面中共用同一個布局,例如,本應用在視圖頂部有一個導航條,該導航條在每個頁面都會出現。Laravel通過在每個頁面中使用Blade布局讓共用這些公用特性變得簡單。
正如我們之前討論的,所有Laravel視圖都存放在 resources/views 中,因此,我們在 resources/views/layouts/app.blade.php 中定義一個新的布局視圖, .blade.php 擴充表明架構使用Blade模板引擎來渲染視圖,當然,你可以使用原生的PHP模板,然而,Blade提供了的標籤文法可以協助我們編寫更加清爽、簡短的模板。
編輯 app.blade.php 內容如下:
// resources/views/layouts/app.blade.php Laravel Quickstart - Basic @yield('content') 注意布局中的 @yield('content') 部分,這是一個Blade指令,用於指定繼承布局的子頁面在這裡可以注入自己的內容。接下來,我們來定義使用該布局的子視圖來提供主體內容。
5.2 定義子視圖
好了,我們已經建立了應用的布局視圖,下面我們需要定義一個包含建立新任務的表單和已存在工作清單的視圖,該視圖檔案存放在 resources/views/tasks.blade.php 。
我們將跳過Bootstrap CSS的樣板檔案而只專註在我們所關注的事情上,不要忘了,你可以從 GitHub 下載本應用的所有資源:
//resources/views/tasks.blade.php@extends('layouts.app')@section('content') @include('common.errors') @endsection 一些需要注意的事項
在繼續往下之前,讓我們簡單談談這個模板。首先,我們使用 @extends 指令告訴Blade我們要使用定義在 resources/views/layouts/app.blade.php 的布局,所有 @section('content') 和 @endsection 之間的內容將會被注入到 app.blade.php 布局的 @yield('contents') 指令位置。
現在,我們已經為應用定義了基本的布局和視圖,接下來,我們準備添加代碼到 POST /task 路由來處理添加新任務到資料庫。
@include('common.errors') 指令將會載入 resources/views/common/errors.blade.php 模板中的內容,我們還沒有定義這個模板,但很快就會了!
現在我們為應用定義了基本布局和視圖檔案,現在我們回到/路由:
Route::get('/', function () { return view('tasks');}); 接下來,我們準備添加代碼到 POST /task 路由以便處理輸入並添加新任務到資料庫。
6、新增工作
6.1 驗證
現在我們已經在視圖中定義了表單,接下來需要在POST /task路由中編寫代碼處理表單請求,我們需要驗證表單輸入,然後才能建立一個新任務。
對這個表單而言,我們將 name 欄位設定為必填項,而且長度不能超過255個字元。如果表單驗證失敗,將會跳轉到前一個頁面,並且將錯誤資訊存放到一次性Session中:
Route::post('/task', function (Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|max:255', ]); if ($validator->fails()) { return redirect('/') ->withInput() ->withErrors($validator); } // Create The Task...}); $errors變數
讓我們停下來討論下上述代碼中的 ->withErrors($validator) 部分, ->withErrors($validator) 會將驗證錯誤資訊存放到一次性session中,以便在視圖中可以通過 $errors 變數訪問。
我們在視圖中使用了 @include('common.errors') 指令來渲染表單驗證錯誤資訊, common.errors 允許我們在所有頁面以統一格式顯示錯誤資訊。我們定義 common.errors 內容如下:
// resources/views/common/errors.blade.php@if (count($errors) > 0) Whoops! Something went wrong!
@foreach ($errors->all() as $error) - {{ $error }}
@endforeach
@endif
註: $errors 變數在每個Laravel視圖中都可以訪問,如果沒有錯誤資訊的話它就是一個空的 ViewErrorBag 執行個體。
6.2 建立任務
現在輸入驗證已經做好了,接下來正式開始建立一個新任務。一旦新任務建立成功,頁面會跳轉到 / 。要建立任務,可以使用Eloquent模型提供的 save 方法:
Route::post('/task', function (Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|max:255', ]); if ($validator->fails()) { return redirect('/') ->withInput() ->withErrors($validator); } $task = new Task; $task->name = $request->name; $task->save(); return redirect('/');}); 好了,到了這裡,我們已經可以成功建立任務,接下來,我們繼續添加代碼到視圖來顯示所有工作清單。
6.3 顯示已存在的任務
首先,我們需要編輯 / 路由傳遞所有已存在任務到視圖。 view 函數接收一個數組作為第二個參數,我們可以將資料通過該數組傳遞到視圖中:
Route::get('/', function () { $tasks = Task::orderBy('created_at', 'asc')->get(); return view('tasks', [ 'tasks' => $tasks ]);}); 資料被傳遞到視圖後,我們可以在 tasks.blade.php 中以表格形式顯示所有任務。Blade中使用 @foreach 處理迴圈資料:
@extends('layouts.app')@section('content') @if (count($tasks) > 0) Current Tasks | Task | |
@foreach ($tasks as $task) | {{ $task->name }} | |
@endforeach
@endif@endsection
至此,本應用基本完成。但是,當任務完成時我們還沒有途徑刪除該任務,接下來我們就來處理這件事。
7、刪除任務
7.1 添加刪除按鈕
我們在 tasks.blade.php 視圖中留了一個“TODO”注釋用於放置刪除按鈕。當刪除按鈕被點擊時, DELETE /task 請求被發送到應用後台:
{{ $task->name }} 關於方法偽造
儘管我們使用的路由是 Route::delete ,但我們在刪除按鈕表單中使用的要求方法為 POST ,HTML表單只支援 GET 和 POST 兩種請求方式,因此我們需要使用某種方式來偽造 DELETE 請求。
我們可以在表單中通過輸出 method_field('DELETE') 來偽造 DELETE 請求,該函數產生一個隱藏的表單輸入框,然後Laravel識別出該輸入並使用其值覆蓋實際的HTTP要求方法。產生的輸入框如下:
7.2 刪除任務
最後,讓我們添加商務邏輯到路由中執行刪除操作,我們可以使用Eloquent提供的 findOrFail 方法從資料庫通過ID擷取模型執行個體,如果不存在則拋出404異常。擷取到模型後,我們使用模型的 delete 方法刪除該模型在資料庫中對應的記錄。記錄被刪除後,跳轉到 / 頁面:
Route::delete('/task/{id}', function ($id) { Task::findOrFail($id)->delete(); return redirect('/');});