首頁 後端開發 php教程 Laravel關於Blade模板引擎的詳解

Laravel關於Blade模板引擎的詳解

Oct 11, 2017 am 09:06 AM
blade laravel 引擎

laravel的模版引擎採用了blade模版引擎,以下這篇文章主要給大家介紹了關於Laravel中Blade模板引擎的相關資料,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

本文主要介紹給大家介紹了Laravel中Blade模板引擎的相關內容,分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹吧。

Blade 模板引擎

#Blade 是laravel 提供的一個簡單強大的模板引擎,它是把Blade 視圖編譯成原生的PHP 程式碼並且快取起來。快取會在 Blade 視圖改變時而改變,這意味著 Blade 並沒有為你的應用程式添加編譯的負擔。 Blade 視圖檔案使用 .blade.php 後綴,一般都儲存在 resources/views 目錄下。

範本繼承

先來看個範例


<!-- Stored in resources/views/layouts/master.blade.php-->
<html>
 <head>
 <title>App Name - @yield(&#39;title&#39;)</title>
 </head>
 <body>
 @section(&#39;sidebar&#39;)
  This is the master sidebar.
 @show
 
 <p class="container">
  @yield(&#39;content&#39;)
 </p>
 </body>
</html>
登入後複製

Blade 模板檔案包含了典型的HTML 標記。你肯定看到了 @section 和 @yield 指令。 @section 指令就如它的名字所暗示的那樣定義了一個內容區塊,而 @yield 指令是用來顯示所提供的掛件區塊所包含的內容。我們已經定義好了一個基本的佈局,接下來我們可以使用 Blade 的 @extends 指令來明確的指定繼承這個佈局。然後使用@section 指令將掛件中的內容掛載到佈局中,在上面的例子中,掛件的內容將被掛載到佈局中的@yield 部分:


<!-- Stored in resoures/views/child.blade.php -->
@extends(&#39;layouts.master&#39;)
 
@section(&#39;title&#39;, &#39;Page Title&#39;)
 
@section(&#39;sidebar&#39;)
 @parent
 
 <p>This is appended to the master sidebar.</p>
@endsection
 
@section(&#39;content&#39;)
 <p>This is my body content.</p>
@endsection
登入後複製

在上面的例子作用sidebar 掛件利用@parent 指令來追加佈局中的sidebar 部分的內容,如果不使用則會覆蓋掉佈局中的這部分。 @parent 指令會在視圖被渲染時替換為佈局中的內容。

Blade 視圖可以像原生PHP 視圖一樣使用全域幫助函數view 來傳回渲染後的內容:


Route::get(&#39;blade&#39;, function () {
 return view(&#39;child&#39;);
});
登入後複製

顯示資料

你可以使用花括號{ 來在視圖中顯示傳遞到視圖中的變量,例如,你定義了下面的路由:


Route::get(&#39;greeting&#39;, function () {
 return view(&#39;welcome&#39;, [&#39;name&#39; => &#39;Duicode&#39;]);
})
登入後複製

你可以在檢視中這樣來輸出name 變數的內容:


Hello, {{ $name }}
登入後複製

當然,你也可以從原生PHP 方法中返回內容。事實上,你可以在Blade echo 宣告中使用任意的PHP 程式碼:(Blade {{}} 宣告中的內容是自動透過htmlentities 方法過濾的,用來防止XSS 攻擊。)


#
The current UNIX timestamp is {{ time() }}
登入後複製

由於許多JavaScript 框架都使用花括號來表示所提供的表達式應該被顯示在瀏覽器中。所以你可以使用@ 符號來告訴Blade 渲染引擎你需要這個表達式原樣保留:


#
Hello, @{{ name }}
登入後複製

我們常用三目運算子來賦值


#
{{ isset($name) ? $name : &#39;Default&#39; }}
登入後複製

Blade 提供了一個方便的方式來取代這個三元宣告:


{{ $name or &#39;Default&#39; }}
登入後複製

預設Blade {{}} 宣告會自動的使用htmlentities 方法來避免XSS 攻擊。如果你不想你的資料被轉義,你可以使用下面的語法,但是要注意,小心被攻擊:


#
Hello, {!! $name !!}
登入後複製

控制結構

你可以透過@if,@elseif,@else和@endif 指令來使用if 控制結構:


@if (count($records) === 1)
 I have one record!
@elseif (count($records) > 1)
 I have multiple records!
@else
 I don&#39;t have any records!
@endif
登入後複製

當然為了方便,Blade 也提供了替代指令@unless 指令:


@unless (Auth::check())
 You are not signed in.
@endunless
登入後複製

也可以使用@hasSection 指令來判斷提供給版面的掛件是否包含了內容:


<title>
 @hasSection(&#39;title&#39;)
 @yield(&#39;title&#39;) - App Name
 @else
 App Name
 @endif
</title>
登入後複製

說到控制少不了循環結構,類似PHP的:


##

@for ($i = 0; $i < 10; $i++)
 The current value is {{ $i }}
@endfor
 
@foreach ($users as $user)
 <p>This is user {{ $user->id }}</p>
@endforeach
 
@forelse ($users as $user)
 <li>{{ $user->name }}</li>
@empty
 <p>No users</p>
@endforelse
 
@while (true)
 <p>I&#39;m looping forever.</p>
@endwhile
登入後複製

Blade 也提供了終止迭代或取消目前迭代的指令:


@foreach ($users as $user)
 @if($user->type == 1)
 @continue
 @endif
 
 <li>{{ $user->name }}</li>
 
 @if($user->number == 5)
 @break
 @endif
@endforeach
登入後複製

你也可以使用指令宣告包含條件的方式來達到中斷:


@foreach ($users as $user)
 @continue($user->type == 1)
 
 <li>{{ $user->name }}</li>
 
 @break($user->number == 5)
@endforeach
登入後複製

包含子視圖

#可以使用@include 指令來包含一個視圖的內容,目前視圖中的變數也會被分享給子視圖:


<p>
 @include(&#39;shared.errors&#39;)
 
 <form>
 <!-- Form Contents -->
 </form>
</p>
登入後複製

儘管子視圖會自動繼承父視圖中的所有資料變量,你也可以直接傳遞一個數組變數來添加額外的變數到子視圖(在Blade 視圖中避免使用__DIR__ 和__FILE__ 常數,因為它們會解析為視圖快取所在的位置):


@include(&#39;view.name&#39;, [&#39;some&#39; => &#39;data&#39;])
登入後複製

你可以使用Blade 的@ each 指令來在一行中合併引入多個視圖:


@each(&#39;view.name&#39;, $jobs, &#39;job&#39;)
登入後複製

第一個參數是數組或集合中每個元素需要被渲染的視圖名稱。


第二個參數是一個陣列或集合,被用來提供迭代。


第三个参数是要分配给当前视图的变量名。

你也可以传递第四个参数到 @each 指令。如果所提供的数组是空数组的话,该参数所提供的视图将会被引入。


@each(&#39;view.name&#39;, $jobs, &#39;job&#39;, &#39;view.empty&#39;)
登入後複製

Blade 中的注释,这样写不会被渲染:


{{-- This comment will not be present in the rendered HTML --}}
登入後複製

Blade 允许你在已命名的堆中压入内容:


@push(&#39;scripts&#39;)
 <script src="/example.js"></script>
@endpush
登入後複製

你可以在你需要的时候压入相同的堆任意的次数,你需要在布局中使用 @stack 来渲染堆:


<head>
 <!-- Head Contents -->
 @stack(&#39;scripts&#39;)
</head>
登入後複製

可以使用 @inject 指令来从服务容器中取回服务:


@inject(&#39;metrics&#39;, &#39;App\Services\MetricsService&#39;)
<p>
 Monthly Revenue: {{ $metrice->monthlyRevenue() }}
</p>
登入後複製

第一个参数将作为所取回服务存放的变量名,

第二个参数是你想要在服务容器中取回的类或接口名称。

可以使用 directvie 方法来注册指令。当 Blade 编译器遇到该指令时,它会自动的调用该指令注册时提供的回调函数并传递它的参数。

下面的例子创建了 @datetime($val) 指令来格式化 $val:


<?php
namespace App\Providers;
 
use Blade;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider{
 /**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot(){
  Blade::directive(&#39;datetime&#39;, function ($expression) {
  return "<?php echo with{$express}->format(&#39;m/d/Y H:i&#39;); ?>";
  });
 }
 
 /**
 * Register bindings in the container
 *
 * @return void
 */
 public function register() {
  //
 }
}
登入後複製

上面的例子中使用了 Laravel 的 with 帮助方法,它只是简单的返回一个所提供的对象或值,并提供方便的链式调用。最终该指令生成的 PHP 代码如下:


<?php echo with($var)->format(&#39;m/d/Y H:i&#39;); ?>
登入後複製

在你更新 Blade 指令的逻辑之后,你应该删除所有已缓存的 Blade 视图,你可以使用 view:clear Artisan 命令来清除。

总结

以上是Laravel關於Blade模板引擎的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在dcat admin中如何實現點擊添加數據的自定義表格功能? 在dcat admin中如何實現點擊添加數據的自定義表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

在Laravel中如何獲取郵件發送失敗時的退信代碼? 在Laravel中如何獲取郵件發送失敗時的退信代碼? Apr 01, 2025 pm 02:45 PM

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Apr 01, 2025 am 09:09 AM

在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

Bangla 部分模型檢索中的 Laravel Eloquent ORM) Bangla 部分模型檢索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

在Laravel6項目中如何有效檢查Redis連接的有效性? 在Laravel6項目中如何有效檢查Redis連接的有效性? Apr 01, 2025 pm 02:00 PM

在Laravel6項目中如何檢查Redis連接的有效性是一個常見的問題,特別是在項目依賴於Redis進行業務處理時。以下是...

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Apr 01, 2025 pm 12:21 PM

Laravel數據庫遷移過程中出現類重複定義問題在使用Laravel框架進行數據庫遷移時,開發者可能會遇到“類已使用�...

See all articles