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

Laravel.ppt
  • 安裝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的使用,更多的資訊請詳參: ViewsBlade

一般而言,我們盡量不要在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 StartedDatabase: Query Builder

Laravel也提供了Validation

也可以利用Laravel提供的Eloquent,就像很多的framework一樣,Laravel也提供一個ORM (Object-Relational Mapping) 程式庫,可以協助我們對應php裡的Class到資料庫裡的table。詳參:Eloquent: Getting Started

參考資料