Laravel
Laravel
2019/11/24
2019/12/06 (updated)
安裝
安裝Laravel 6,必須要先安裝php (php 7.2以上),以及Composer (詳參: Installation)
Composer
Composer是php的相依套件(Dependency)管理工具,其他的語言、框架也有類似的工具,例如: NuGet、Node Package Manager (NPM)、Maven (詳參: 管理軟體相依性(Managing software dependencies)、Dependencies management in 2019: a review)。
首先,先安裝Composer。
For Windows,到Download Composer下載
利用Windows Installer,下載Composer-Setup.exe
For Mac
brew install composer
利用Command-line installation,透過php進行安裝,詳參Download Composer
打開command prompt (參考: 10 Ways to Open the Command Prompt in Windows 10)或power shell(系統管理員),執行Composer
Composer
Laravel
安裝Laravel,在command prompt/power shell下執行:
composer global require laravel/installer
新增專案之前,先檢查一下extension
extension=fileinfo
處理好之後,換到我們想要安裝的路徑
cd c:\LaravelProjects
利用laravel產生一個新專案:laravel
laravel new Laravel6Demo
看一下laravel的版本
php artisan --version
目前的版本是
Laravel Framework 6.6.0
Laravel會產生對應的所有目錄及檔案,我們到該目錄下,啟動web server
cd Laravel6Demo
php artisan serve
注意,為避免跟apache衝突,artisan使用port 8000,所以,在瀏覽器裡輸入就可以看到剛架好的專案:
http://localhost:8000
![](https://www.google.com/images/icons/product/drive-32.png)
安裝Composer
利用Composer安裝Laravel
利用Laravel產生新專案
利用Laravel啟動web server
基本概念
一個新的Laravel專案會有許多的檔案及檔案夾,比較常使用的資料夾有:
app
Http
Controllers
config
resources
views
routes
php是讓使用者直接去執行php檔案,然而,一般的web framework都不會這樣設計,而是會有route的設定,利用route讓系統的保護簡單多了。route的設定有很多種方式,Laravel利用routes/web.php來定義url。
另外,一般的web framework會採用MVC (Model View Controller)的架構,也就是把程式碼切割為商業邏輯 (Model)、使用者介面 (View)並利用控制層(Controller)串接商業邏輯(Model)及使用者介面(View)。傳統的php會在html裡夾雜php程式碼,在Laravel裡,會利用blade,讓html裡不再夾雜php程式碼。也就是在View裡就看不到php語法了。再進一步,blade也提供了template的概念,利用template讓很多的view共用內容。
Routes
在一個新的Laravel專案裡,在routes裡有個web.php,這裡面目前只有一個Route,這個Route是利用Route類別中的get函數,第一個參數是對應的url,第二個參數是當使用者呼叫這個url時,所要執行的function,這裡,寫了一個匿名函數 (詳參: PHP中的Closure)。這個匿名函數回傳了view的名稱。
我們先把內容(routes/web.php)改成:
<?php
Route::get('/', function () {
return 'First Laravel';
});
就會在網頁上看到「First Laravel」。簡單的說,當使用者利用http get呼叫"/"時,就會去執行這一段程式。
那如果要去打開一個檔案,那就恢復原本的內容:
<?php
Route::get('/', function () {
return view('welcome');
});
這時候,就會去呼叫resourses\views\welcome.blade.php。我們再加一個route:
<?php
Route::get('/', function () {
return view('welcome');
});
Route::get('/hi', function () {
return 'First Laravel';
});
在瀏覽器,輸入:
http://localhost:8000/hi
可以在瀏覽器上看到「First Laravel」。
目前介紹的概念是所謂的http route,也就是指定url對應的功能,目前介紹的是開啟一個view。還有更多的使用方式,詳參 Routing。
Views
一般的web framework會採用MVC (Model View Controller)的架構,也就是把程式碼切割為商業邏輯 (Model)、使用者介面 (View)並利用控制層(Controller)串接商業邏輯(Model)及使用者介面(View)。傳統的php會在html裡夾雜php程式碼,在Laravel裡,會利用blade,讓html裡不再夾雜php程式碼。也就是在View裡就看不到php語法了。再進一步,blade也提供了template的概念,利用template讓很多的view共用內容。
看一下routes/web.php
<?php
Route::get('/', function () {
return view('welcome');
});
Route::get('/hi', function () {
return 'First Laravel';
});
在第一個route裡,就是告訴Laravel要開啟welcome.blade.php,接下來,我們來新增一個新的view。
resources/views/hi.blade.php
<h1>Hi! Laravel!</h1>
<p>This is my first Laravel view</p>
修改一下routes/web.php
<?php
Route::get('/', function () {
return view('welcome');
});
Route::get('/hi', function () {
return view('hi');
});
這樣,就可以打開這一頁了。
如果我們要傳變數到view裡面,修改一下routes/web.php,陣列的key是title,會成為在view裡的變數名稱,陣列的value就會是傳到view的內容:
<?php
Route::get('/', function () {
return view('welcome');
});
Route::get('/hi', function () {
return view('hi', ['title'=>'Ben']);
});
我們可以使用blade的語法,利用「{{」、「}}」,中間放變數名稱,就會將route傳過來的變數,顯示在這裡。使用blade的最大好處是,當變數不存在時,blade不像php會自動產生變數,而是產生錯誤訊息。
resources/views/hi.blade.php
<h1>Hi! Laravel!</h1>
<p>This is my first Laravel view for {{ $title }}</p>
事實上,也可以使用php的語法。
<h1>Hi! Laravel!</h1>
<p>This is my first Laravel view for <?= $title ?></p>
但是,因為blade語法比php語法簡潔多了,而且blade也提供了更多的彈性做法,未來我們就不在view裡使用php語法。
回到routes/web.php,如果我們要傳變數內容,可以改為:
Route::get('/hi', function () {
$title = 'Ben';
return view('hi', ['title'=>$title]);
});
在Laravel裡,有個簡潔的寫法:
Route::get('/hi', function () {
$title = 'Ben';
return view('hi', compact('title'));
});
因為一般而言,我們會有很多的view,如果要把view放進一個檔案夾裡,我們可以這樣修改:
Route::get('/hi', function () {
$title = 'Ben';
return view('first.hi', compact('title'));
});
這樣,我們就可以把resources/views/hi.blade.php移到resources/views/first/hi.blade.php。
目前只介紹最基本的view及blade的使用,更多的資訊請詳參: Views 、Blade。
一般而言,我們盡量不要在route裡有太多的邏輯,而是將這些邏輯抽離,接下來,我們就要介紹,MVC的下一個概念:Controller。
Controllers
一般的web framework會採用MVC (Model View Controller)的架構,也就是把程式碼切割為商業邏輯 (Model)、使用者介面 (View)並利用控制層(Controller)串接商業邏輯(Model)及使用者介面(View)。我們已經介紹了View,接下來,要介紹Controller。
首先,先產生一個Controller。
我們可以利用artisan來幫我們產生一個Controller,名稱為HiController,在這裡,因為controller在Laravel裡是個類別,所以,檔案的第一個字母會是大寫,另外,檔案名稱最後習慣上也會加上Controller,並且,利用大小寫分割英文單字,如:
php artisan make:controller HiController
artisan就會幫我們產生一個檔案HiController.php,並且放到正確的檔案夾App\Http\Controller\裡,也產生了需要的程式碼,就像剛剛解釋的,你會發現HiController是個類別,並且繼承了Controller類別,你可以看到,Controller其實就在同一個目錄下。當然,你也可以複製以下的內容,並放到對應的檔案夾裡。App\Http\Controller\HiController.php內容為:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HiController extends Controller
{
//
}
接下來,我們新增一個index函數,並把route裡的內容搬過來,並把內容放在index裡:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HiController extends Controller
{
public function index(){
$title = 'Ben';
return view('hi', compact('title'));
}
}
將routes/web.php改為,也就是說會去呼叫HiController裡的index方法。
<?php
Route::get('/', function () {
return view('welcome');
});
Route::get('/hi', 'HiController@index');
這邊只是介紹最基礎的用法,更多的用法請詳參: Controllers。
接下來,我們要介紹如何在Laravel中使用資料庫。
Database
Laravel提供了很多的工具,讓我們在使用資料庫上方便多了。首先,Laravel把資料庫環境的設定集中在
.env下,我們把下面的參數修改成我們的參數
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
routes/web.php新增一個route:
Route::get('/job', 'JobController@index');
新增一個JobController,在這裡利用Laravel提供的DB類別,並使用DB提供的select函數,將取得的內容傳給view,App\Http\Controllers\JobController.php的內容:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class JobController extends Controller
{
public function index(){
$jobs = DB::select('select * from job');
return view('job.index', compact('jobs'));
}
}
resources\views\job.blade.php的內容,我們利用blade裡的foreach語法 (詳參: Loops),使用的方法跟php語法其實很像,注意,Laravel回傳回來的是物件,不是Associative Array:
<html>
<body>
<table>
<tr>
<td>Id</td>
<td>Company</td>
<td>Content</td>
<td>Date</td>
</tr>
@foreach ($jobs as $job)
<tr>
<td>{{ $job->postid }}</td>
<td>{{ $job->company }}</td>
<td>{{ $job->content }}</td>
<td>{{ $job->pdate }}</td>
</tr>
@endforeach
</table>
</body>
</html>
這樣就可以取得資料了!
新增資料的話,因為是利用http post,所以,route的設定是:
Route::post('/job', 'JobController@create');
resources\views\job.blade.php增加了一個form,在Laravel裡,提供了一個@csrf來防止CSRF攻擊。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<form action='job' method='post'>
@csrf
求才廠商:<input type="text" name="company"><br />
求才內容:<textarea name="content" cols="40" rows="3"></textarea><br />
求才日期:<input type="date" name="pdate"><br />
<input type="submit" value="送出"><br />
</form>
<table>
<tr>
<td>序號</td>
<td>求才廠商</td>
<td>求才內容</td>
<td>求才日期</td>
</tr>
@foreach ($jobs as $job)
<tr>
<td>{{ $job->postid }}</td>
<td>{{ $job->company }}</td>
<td>{{ $job->content }}</td>
<td>{{ $job->pdate }}</td>
</tr>
@endforeach
</table>
</body>
</html>
App\Http\Controllers\JobController.php新增create函數,利用insert將內容新增到資料庫,在Laravel裡,使用的是request物件來取得post的資料。(詳參: HTTP Requests)最後,利用redirect回到本頁:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class JobController extends Controller
{
public function index(){
$jobs = DB::select('select * from job');
return view('job.index', compact('jobs'));
}
public function create(Request $request){
DB::insert('insert into job (company, content, pdate) values (?, ?, ?)',[
$request->company,
$request->content,
$request->pdate
]);
return redirect()->back();
}
}
也可以利用QueryBuilder,利用QueryBuilder的好處是不用使用SQL語法,內容改成:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class JobController extends Controller
{
public function index(){
$jobs = DB::table('job')->get();
return view('job.index', compact('jobs'));
}
public function create(Request $request){
DB::table('job')->insert([
'company'=>$request->company,
'content'=>$request->content,
'pdate'=>$request->pdate,
]);
}
}
也可以將$request直接給insert函數,只是因為我們啟用了@csrf,會多收到一個「_token」,就必須要把「_token」移除:
class JobController extends Controller
{
public function index(){
$jobs = DB::table('job')->get();
return view('job.index', compact('jobs'));
}
public function create(Request $request){
DB::table('job')->insert($request->except(['_token']));
return redirect()->back();
}
}
這邊只是很基本的介紹,更多內容請詳參: Database: Getting Started、Database: Query Builder。
Laravel也提供了Validation。
也可以利用Laravel提供的Eloquent,就像很多的framework一樣,Laravel也提供一個ORM (Object-Relational Mapping) 程式庫,可以協助我們對應php裡的Class到資料庫裡的table。詳參:Eloquent: Getting Started 。
參考資料
Laravel 8
Laravel 6
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 (第 11 屆 iT 邦幫忙鐵人賽 )
Laravel 6 CRUD Example | Laravel 6 Tutorial For Beginners
Step 1: Configure the MySQL Database
Step 2: Create the model and migration files
Step 3: Create routes and controller
Step 4: Configure Bootstrap 4
Step 5: Create the views
Step 6: Add Validation rules and save data
Step 7: Display the data
Step 8: Create Edit and Update Operation
Step 9: Create Delete Functionality
Laravel 6 Tutorial for Beginner: Create your First To-Do App
Steps to create your first Laravel Application using Laravel tutorial
Create Your Project
Configure Database
Make Auth
Migrations
Eloquent Models
One-to-Many Relationship
Artisan Tinker -- (Totally Optional)
Controllers
Routing
Views – Blade Templates
Route-Model Bindng
Editing views
Run the project in Localhost
Laravel 6 Beginner (14 lessons)
Installation (5:10)
Routes (3:13)
Views (4:10)
Pass Data to View (3:35)
Controllers (8:13)
Blade Templates (15:24)
MySQL Database & SQLite (20:46)
Form Validation (25:34)
Laravel 6 Advanced (10 lessons)
Laravel 5.X