Blade簡單介紹

在Laravel中,Blade是一個模板引擎,可以用來將PHP原始碼和HTML混合在一起,並且可以使用一些簡單的語法來處理資料,讓程式碼更加簡潔。

Blade基本語法

  • {{ }}用於輸出變數,例如{{ $title }},此用法會自動把輸出的內容做HTML轉義,例如{{ $title }}輸出<h1>title</h1>會變成&lt;h1&gt;title&lt;/h1&gt;
  • {!! !!}而這語法不會做其他動作,直接輸出原始值,例如{!! $title !!}
  • @php用於寫原生PHP,例如@php echo $title; @endphp,也可以使用@php($title)來簡化
  • @if@elseif@else@endif用於處理if的情況,用法如下:
1
2
3
4
5
6
7
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
  • @include('blade')用於引入其他blade檔案,例如@include('blade', ['title' => 'title']),第二個參數可以傳入變數
  • includeif('blade')用於當blade檔案存在時才引入
  • @includeWhen($boolean, 'blade')用於當$boolean為true時才引入

常見迴圈用法:

  • @for@foreach@forelse@while用於處理迴圈的情況,用法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 就是for
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor

// 就是foreach
@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach

// 這比較特別,當users為空時會顯示No users(內建空值方法)
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>No users</p>
@endforelse

// 就是while
@while (true)
<p>Hello World!</p>
@endwhile

// 在以上迴圈中,都可以使用以下方法
@continue
@break

// 並且可用在迴圈中用$loop變數來取得迴圈資訊,方法非常多,以下列出常用的
$loop->index // 索引值
$loop->iteration // 迴圈次數
$loop->remaining // 剩餘次數
$loop->count // 迴圈總次數
$loop->first // 是否為第一次迴圈
$loop->last // 是否為最後一次迴圈
$loop->depth // 迴圈巢狀深度
$loop->parent // 父迴圈

form表單中常用方法:

  • @csrf用於處理csrf的情況,例如@csrf
  • @method('PUT')用於處理form表單中需要使用GET、POST之外的方法時可定義用法使用,例如以下範例:
1
2
3
4
<form action="/foo/bar" method="POST">
@method('PUT') // 會產生一個隱藏的input,內容為PUT
@csrf // 會產生一個隱藏的input,內容為csrf token
</form>

常用layout用法:

  • @extends('blade')用於繼承其他blade檔案
  • @section('title', 'title')來定義區塊
  • @yield('title', 'default')來輸出區塊
  • @parent來繼承父區塊
  • @stack('scripts')@push('scripts')用於處理區塊堆疊的情況,與@section@yield不同的是,@stack可以定義多個區塊
  • 範例說明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// content.blade.php
@extends('layouts.app')

@section('title', 'title')

@section('content')
@parent
<p>This is my body content.</p>

@push('scripts')
<script src="/example.js"></script>
@endpush
@endsection

// layouts/app.blade.php
<html>
<head>
<title>App Name - @yield('title')</title>
</head>
<body>
@section('sidebar')
This is the master sidebar.
@endsection
<div class="container">
@yield('content')
</div>
@stack('scripts')
</body>
</html>

// 輸出結果
<html>
<head>
<title>App Name - title</title>
</head>
<body>
This is the master sidebar.
<div class="container">
<p>This is my body content.</p>
</div>
<script src="/example.js"></script>
</body>
</html>

其餘常用用法:

  • @lang('message')功能與{{ __('message') }}相同,會自動html轉義,用於處理語系的情況,用法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
// resources/lang/en/messages.php
return [
'welcome' => 'Welcome to our application'
];

// resources/lang/zh-TW/messages.php
return [
'welcome' => '歡迎來到我們的應用程式'
];

// resources/views/welcome.blade.php
// 以下內容會依照語系輸出不同的內容
@lang('messages.welcome')
  • @verbatim用於處理不需要解析的情況,用法如下:
1
2
3
4
5
6
// 以下內容不會被blade解析,會直接輸出
@verbatim
<div class="container">
Hello, {{ $name }}.
</div>
@endverbatim
  • @error('title')用於處理錯誤訊息的情況,大多為驗證錯誤時會帶著快閃Session跳回上一頁並顯示錯誤訊息,用法如下:
1
2
3
4
// 當快閃Session中有system_error的錯誤訊息時,才會顯示包起來的內容
@error('system_error')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
  • @dump($array)用於處理輸出變數的情況,和var_dump相同,但輸出內容更好看,用法如下:
1
2
// 以下內容會輸出變數內容
@dump($array)
  • @dd($array)用於處理輸出變數的情況,輸出內容更詳細和好看但是會中斷程式,用法如下:
1
2
// 以下內容會輸出變數內容並中斷程式
@dd($array)