瞭解Laravel Blade及其使用方法

瞭解Laravel Blade及其使用方法

Laravel 的模板引擎支援 React、Vue 和其他庫。然而,開發者最喜歡的還是 Laravel Blade 引擎的強大功能,它可以快速建立模組化、可重用的檢視。Blade 可以讓你毫不費力地擴充套件布局、定義版塊,並使用控制結構生成資料驅動的內容。

這篇實踐文章將探討 Blade 是什麼、如何工作以及如何增強你的 Laravel 應用程式。

使用 Laravel Blade 所需的一切

Laravel Blade 是 Laravel 框架的預設模板引擎。它能讓你在 HTML 程式碼中直接使用變數、迴圈、條件語句和其他 PHP 功能。要建立 Blade 檔案,只需在 Laravel 專案的 resources/views 目錄下建立副檔名為 .blade.php 的檔案,定義 Blade 檢視,然後在這些檔案中構建你喜歡的動態頁面。

為什麼要使用 Blade?

Blade的一個主要優點是它的模組化程式碼組織。Blade可以將程式碼組織成可重複使用的模組,您可以輕鬆地新增、刪除或更新這些模組,而不會影響應用程式的其他部分。

程式碼封裝是 Blade 的另一個優勢。Blade 可幫助封裝功能,使測試、除錯和程式碼維護更加易於管理。這種方法有利於大型應用程式,因為沒有組織的應用程式很快就會變得難以管理。

Blade 的模板引擎效能卓越,是我們測試過的速度最快的 PHP 框架。該引擎會將所有 Blade 檢視編譯成純 PHP 程式碼,然後快取起來,直到你修改它們。這種方法提高了渲染速度和整體效能。

如何使用 Laravel Blade

在本教程中,我們將建立一個 Laravel 應用程式來體驗 Blade 模板的實際應用。學習定義和擴充套件 Blade 佈局、在 Blade 檢視之間傳遞資料、使用各種可用的控制結構,以及建立自己的 Blade。

先決條件

要學習本教程,請確保您具備以下條件:

  • 熟悉 PHP
  • 已安裝 Composer。執行 composer -V 驗證系統中是否安裝了 Composer。

請檢視完整的教程程式碼,以便在工作時獲得指導。

如何建立 Laravel 應用程式

要建立 Laravel 應用程式示例,請執行:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
composer create-project laravel/laravel my-app
composer create-project laravel/laravel my-app
composer create-project laravel/laravel my-app

按照終端上的提示完成應用程式的製作。

接下來,進入應用程式目錄,使用此命令為其提供服務:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cd my-app
php artisan serve
cd my-app php artisan serve
cd my-app
php artisan serve

點選終端中的連結,在瀏覽器上開啟 Laravel 歡迎頁面。

如何定義佈局

佈局可讓您配置網路應用程式的各個部分,以便在多個頁面之間共享。例如,如果您的應用程式在各個頁面中使用一致的導航欄和頁尾,那麼一次建立比為每個頁面重新建立更有效。

在學習逐步說明之前,請先看看下面的骨架演示。

建立無佈局網站的程式碼如下所示。它要求你為每個頁面重新編寫導航欄和頁尾程式碼。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!-- Page 1 -->
<nav>. . . </nav>
Content for page 1
<footer> . . . </footer>
<!-- Page 1 --> <nav>. . . </nav> Content for page 1 <footer> . . . </footer>
<!-- Page 1 -->
<nav>. . . </nav>
Content for page 1
<footer> . . . </footer>
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!-- Page 2 -->
<nav>. . . </nav>
Content for page 2
<footer> . . . </footer>
<!-- Page 2 --> <nav>. . . </nav> Content for page 2 <footer> . . . </footer>
<!-- Page 2 -->
<nav>. . . </nav>
Content for page 2
<footer> . . . </footer>

相反,您可以使用佈局輕鬆構建應用程式,在單個程式碼塊中共享相同的元件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!-- Main layout code -->
<nav>. . . </nav>
{slot}
<footer> . . . </footer>
<!-- Main layout code --> <nav>. . . </nav> {slot} <footer> . . . </footer>
<!-- Main layout code -->
<nav>. . . </nav>
{slot}
<footer> . . . </footer>

一旦定義了佈局,就可以在任何頁面上使用:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!-- Page 1 or Page n -->
<main-layout>
Content for page n
</main-layout>
<!-- Page 1 or Page n --> <main-layout> Content for page n </main-layout>
<!-- Page 1 or Page n -->
<main-layout>
Content for page n
</main-layout>

在舊版本的 Laravel 中,你必須使用模板繼承來建立佈局。然而,當公司新增了元件功能後,建立強大的佈局就變得容易多了。

要使用 Laravel Blade 建立一個新佈局,首先要執行這條命令來建立佈局的元件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:component Layout
php artisan make:component Layout
php artisan make:component Layout

該命令會生成一個新的 layout.blade.php 檔案,該檔案位於 resources/views/ 目錄下名為 components 的新資料夾中。開啟該檔案並貼上以下程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<html>
<head>
<title>{{ $title ?? 'Example Website' }}</title>
<link rel="stylesheet" href="{{ asset('/css/app.css') }}">
</head>
<body>
<nav>
<h3>Welcome to my website</h3>
<hr>
</nav>
{{ $slot }}
<footer>
<hr />
© 2023 example.com
</footer>
</body>
</html>
<html> <head> <title>{{ $title ?? 'Example Website' }}</title> <link rel="stylesheet" href="{{ asset('/css/app.css') }}"> </head> <body> <nav> <h3>Welcome to my website</h3> <hr> </nav> {{ $slot }} <footer> <hr /> © 2023 example.com </footer> </body> </html>
<html>
<head>
<title>{{ $title ?? 'Example Website' }}</title>
<link rel="stylesheet" href="{{ asset('/css/app.css') }}">
</head>
<body>
<nav>
<h3>Welcome to my website</h3>
<hr>
</nav>
{{ $slot }}
<footer>
<hr />
© 2023 example.com
</footer>
</body>
</html>

這段程式碼將建立一個具有簡單導航欄和頁尾的佈局元件。 slot 函式定義了在擴充套件布局元件時傳遞主要內容的位置。

如何擴充套件布局

您可以使用標籤在 blade  檢視中輕鬆匯入元件。此方法同樣適用於你之前建立的佈局元件。

要檢視擴充套件布局的效果,請開啟預設的 resources/views/welcome.blade.php 檔案,並用以下程式碼替換該檔案的內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<x-layout>
<div>
<h1>Hello World!</h1>
<p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p>
<button class="btn">Get Started</button>
</div>
</x-layout>
<x-layout> <div> <h1>Hello World!</h1> <p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p> <button class="btn">Get Started</button> </div> </x-layout>
<x-layout>
<div>
<h1>Hello World!</h1>
<p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p>
<button class="btn">Get Started</button>
</div>
</x-layout>

這種方法可以更新歡迎頁面以使用佈局元件,同時傳遞一個標題元素和一段模擬文字作為其內容。重新載入之前開啟的連結,檢視更改。

在佈局定義中,請注意如果程式碼不傳遞標題資料,則會呈現預設為 “Example Website” 的標題資料。您可以通過 <x-slot name="slotName" /> 程式碼在檢視中以命名槽的形式傳遞這些資料,在本例中就是 <x-slot name="title" /> 。用下面的程式碼更新 welcome.blade.php 檔案,然後重新載入頁面:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<div>
<h1>Hello World!</h1>
<p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p>
<button class="btn">Get Started</button>
</div>
</x-layout>
<x-layout> <x-slot name="title"> Home | Example Website </x-slot> <div> <h1>Hello World!</h1> <p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p> <button class="btn">Get Started</button> </div> </x-layout>
<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<div>
<h1>Hello World!</h1>
<p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p>
<button class="btn">Get Started</button>
</div>
</x-layout>

接下來,新增一些樣式來增強應用程式的外觀。在 /public/css 目錄下新建一個 app.css 檔案,然後貼上該檔案中的程式碼。

完成所有這些更新後,您在 http://127.0.0.1:8000/ 上預覽應用程式時應該會看到以下輸出。

Hello world

Hello world

如何加入後臺資料

在前面的示例中,你通過插槽在元件和檢視之間輕鬆地共享了資料。不過,從資料庫或其他遠端源載入資料有更好的方法。

在這種情況下,可以直接從路由器定義中載入和傳遞資料,並像訪問前例中的命名槽一樣訪問資料。為此,請開啟 routes/web.php 檔案,並用以下程式碼替換其內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
$name = "John Doe";
return view('welcome', ['name' => $name]);
});
<?php use Illuminate\Support\Facades\Route; Route::get('/', function () { $name = "John Doe"; return view('welcome', ['name' => $name]); });
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
$name = "John Doe";
return view('welcome', ['name' => $name]);
});

在上面的程式碼中,您更新了網路路由,將名稱 ” John Doe ” 傳遞給了歡迎檢視。現在,像這樣在 blade 檢視中訪問這個值:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div>
Hello, {{ $name }}
<!-- Outputs: Hello, John Doe -->
</div>
<div> Hello, {{ $name }} <!-- Outputs: Hello, John Doe --> </div>
<div>
Hello, {{ $name }}
<!-- Outputs: Hello, John Doe -->
</div>

您可以使用這種方法從資料庫載入資料。例如,假設您有一個包含待辦事項列表的待辦事項表。使用 DB facade 載入這些待辦事項,並將它們傳遞給檢視:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
use Illuminate\Support\Facades\DB; // Import DB Facade
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
$todos = DB::table('todos')->get();
return view('welcome', ['todos' => $todos]);
});
<?php use Illuminate\Support\Facades\DB; // Import DB Facade use Illuminate\Support\Facades\Route; Route::get('/', function () { $todos = DB::table('todos')->get(); return view('welcome', ['todos' => $todos]); });
<?php
use Illuminate\Support\Facades\DB; // Import DB Facade
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
$todos = DB::table('todos')->get();
return view('welcome', ['todos' => $todos]);
});

不過,如果您沒有資料庫,可更新網路入口路由以傳遞靜態待辦事項陣列。開啟 routes/web.php 檔案,用下面的程式碼更新預設 ( / ) 路由:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Route::get('/', function () {
$todos = ['Learn Laravel', 'Learn Blade', 'Build Cool Stuff'];
return view('welcome', ['todos' => $todos]);
});
Route::get('/', function () { $todos = ['Learn Laravel', 'Learn Blade', 'Build Cool Stuff']; return view('welcome', ['todos' => $todos]); });
Route::get('/', function () {
$todos = ['Learn Laravel', 'Learn Blade', 'Build Cool Stuff'];
return view('welcome', ['todos' => $todos]);
});

用下面的程式碼替換 welcome.blade.php 檔案的內容,以 JSON 編碼陣列的形式訪問待辦事項。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<p>{{ json_encode($todos) }}</p>
<!-- Output: ["Learn Laravel","Learn Blade","Build Cool Stuff"] -->
</x-layout>
<x-layout> <x-slot name="title"> Home | Example Website </x-slot> <p>{{ json_encode($todos) }}</p> <!-- Output: ["Learn Laravel","Learn Blade","Build Cool Stuff"] --> </x-layout>
<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<p>{{ json_encode($todos) }}</p>
<!-- Output:  ["Learn Laravel","Learn Blade","Build Cool Stuff"] -->
</x-layout>

如何使用控制快捷鍵

Blade 模板引擎還支援多個指令,以有條件地呈現各種資料型別。例如,要遍歷傳給歡迎檢視的 to-dos 返回陣列,可在 welcome.blade.php 檔案中貼上以下程式碼,應用 foreach 迴圈:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<ul>
@foreach ($todos as $todo)
<li>{{ $todo }}</li>
@endforeach
</ul>
</x-layout>
<x-layout> <x-slot name="title"> Home | Example Website </x-slot> <ul> @foreach ($todos as $todo) <li>{{ $todo }}</li> @endforeach </ul> </x-layout>
<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<ul>
@foreach ($todos as $todo)
<li>{{ $todo }}</li>
@endforeach
</ul>     
</x-layout>

這一更改將以無序列表的形式顯示待辦事項,就像下面的截圖一樣。

無序列表中的待辦事項

無序列表中的待辦事項

要構建條件語句塊,可使用 @if@elseif@else@endif 指令。例如

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@if (count($todos) === 1)
<p>I have one task!</p>
@elseif (count($todos) > 1)
<p>I have multiple tasks!</p>
@else
<p>I don't have any tasks!</p>
@endif
@if (count($todos) === 1) <p>I have one task!</p> @elseif (count($todos) > 1) <p>I have multiple tasks!</p> @else <p>I don't have any tasks!</p> @endif
@if (count($todos) === 1)
<p>I have one task!</p>
@elseif (count($todos) > 1)
<p>I have multiple tasks!</p>
@else
<p>I don't have any tasks!</p>
@endif

用上述程式碼替換 welcome.blade.php 檔案的內容。各種 if-else 指令會計算待辦事項,並在不同情況下顯示自定義資訊。如果您的待辦事項陣列中包含多個任務,您就會在瀏覽器中看到輸出 “I have multiple tasks!”(我有多個任務!)。

你可以在 Laravel 文件中找到更多支援的指令。

如何構建自定義擴充套件

您也可以編寫與上例類似的自定義指令。要探索這種技術,請建立一個自定義文字截斷指令。

首先,執行以下命令建立一個新的服務提供器

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:provider TruncateTextServiceProvider
php artisan make:provider TruncateTextServiceProvider
php artisan make:provider TruncateTextServiceProvider

該命令會生成一個新的服務提供器檔案,檔名為 app/Providers/TruncateTextServiceProvider.php。開啟該檔案並將其內容替換為

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class TruncateTextServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
Blade::directive('truncate', function ($expression) {
list($text, $length) = explode(',', $expression);
return "<?php echo Str::limit($text, $length); ?>";
});
}
}
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class TruncateTextServiceProvider extends ServiceProvider { public function register() { // } public function boot() { Blade::directive('truncate', function ($expression) { list($text, $length) = explode(',', $expression); return "<?php echo Str::limit($text, $length); ?>"; }); } }
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class TruncateTextServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
Blade::directive('truncate', function ($expression) {
list($text, $length) = explode(',', $expression);
return "<?php echo Str::limit($text, $length); ?>";
});
}
}

程式碼匯入了 Blade Facade,並定義了一個名為 @truncate 的新自定義指令。該指令接受兩個引數: $text$length 。它使用 Str::limit() 方法將文字截斷到指定長度。

最後,將服務提供者新增到 config/app.php 配置檔案中的提供者陣列中,註冊服務提供者:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
'providers' => [
// Other service providers
App\Providers\TruncateTextServiceProvider::class,
],
'providers' => [ // Other service providers App\Providers\TruncateTextServiceProvider::class, ],
'providers' => [
// Other service providers
App\Providers\TruncateTextServiceProvider::class,
],

在 Blade 模板(welcome.blade.php)中使用自定義指令,通過 @truncate 語法呼叫它。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div>
@truncate('Lorem ipsum dolor sit amet', 10)
<!-- Outputs: Lorem ipsu... -->
</div>
<div> @truncate('Lorem ipsum dolor sit amet', 10) <!-- Outputs: Lorem ipsu... --> </div>
<div>
@truncate('Lorem ipsum dolor sit amet', 10)
<!-- Outputs: Lorem ipsu... -->
</div>

小結

本文探討了 Laravel Blade 如何幫助你簡化開發流程,同時為網路應用程式建立模組化和可重用的檢視。然而,你的 Laravel 開發之旅不應該就此結束。

評論留言