2019/11/24
2019/12/06 (updated)
2025/02/14 (updated)
當系統越來越複雜的時候,就會需要利用一些現有的架構來協助我們開發,簡單的講,就是套用現成的開發方式來開發。如果利用Java進行web開發,常用的是Spring Framework,如果使用.net,常用的是.net MVC,如果使用Python則會使用Django或FAST。而PHP也有一些架構,如Laravel、Slim及CodeIgniter。這邊介紹最多人使用也最完整的Laravel。
Laravel目前最新版本為11 (第12版預計2025/2/24就會上線),安裝Laravel 11,必須要先安裝php (php 8.2以上),以及Composer (詳參: Installation)。
由於第12版就快上線,以下內容等上線後一併更新內容到第12版。
What’s New in Laravel 12: An Early Look and Release Date
Improved Performance and Scalability
Streamlined Dependency Injection
Enhanced Developer Experience
Advanced Query Builder Enhancements
Security Enhancements
Modernized Frontend Scaffolding
Enhanced API Development
Improved Testing and Debugging Tools
Advanced Eloquent ORM Features
Enhanced Job and Queue Management
Modern DevOps Integration
安裝Composer
利用Composer安裝Laravel
利用Laravel產生新專案
利用Laravel啟動web server
Composer是php的相依套件(Dependency)管理工具,其他的語言、框架也有類似的工具,例如: NuGet、Node Package Manager (NPM)、Maven (詳參: 管理軟體相依性(Managing software dependencies)、Dependencies management in 2019: a review)。
For Windows,到Download Composer下載
利用Windows Installer,下載Composer-Setup.exe
Install Composer on Windows with XAMPP
下載前先開啟SSL,把php.ini前的「;」去掉,重啟xampp
extension=php_openssl.dll
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,在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
一個新的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共用內容。
在一個新的Laravel專案裡,在routes裡有個web.php,這裡面目前只有一個Route,這個Route是利用Route類別中的get函數,第一個參數是對應的url,第二個參數是當使用者呼叫這個url時,所要執行的function,這裡,寫了一個匿名函數。這個匿名函數回傳了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。
一般的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。
一般的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中使用資料庫。
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