Laravel 的 Blade 模板引擎
简介
Blade 是 Laravel 提供的一个既简单又强大的模板引擎。和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它 被修改,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何额外负担。Blade 视图文件使用 .blade.php
扩展名,一般被存放在 resources/views
目录。
模板继承
定义页面布局
Blade 的两个主要优点是 模板继承 和 区块 。
为方便开始,让我们先通过一个简单的例子来上手。首先,我们需要确认一个 "master" 的页面布局。因为大多数 web 应用是在不同的页面中使用相同的布局方式,我们可以很方便的定义这个 Blade 布局视图:
<!-- 文件保存于 resources/views/layouts/app.blade.php -->
<html>
<head>
<title>应用程序名称 - @yield('title')</title>
</head>
<body>
@section('sidebar')
这是 master 的侧边栏。
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
如你所见,该文件包含了典型的 HTML 语法。不过,请注意 @section
和 @yield
命令。 @section
命令正如其名字所暗示的一样是用来定义一个视图区块的,而 @yield
指令是用来显示指定区块的内容的。
现在,我们已经定义好了这个应用程序的布局,让我们接着来定义一个继承此布局的子页面。
继承页面布局
当定义子页面时,你可以使用 Blade 提供的 @extends
命令来为子页面指定其所 「继承」 的页面布局。 当子页面继承布局之后,即可使用 @section
命令将内容注入于布局的 @section
区块中。切记,在上面的例子里,布局中使用 @yield
的地方将会显示这些区块中的内容:
<!-- Stored in resources/views/child.blade.php -->
@extends('layouts.app')
@section('title', 'Page Title')
@section('sidebar')
@@parent
<p>This is appended to the master sidebar.</p>
@endsection
@section('content')
<p>This is my body content.</p>
@endsection
在上面的例子里,sidebar
区块利用了 @@parent
命令追加布局中的 sidebar 区块中的内容,如果不使用则会覆盖掉布局中的这部分内容。 @@parent
命令会在视图被渲染时替换为布局中的内容。
当然,可以通过在路由中使用全局辅助函数 view
来返回 Blade 视图:
Route::get('blade', function () {
return view('child');
});
组件 & Slots
组件和 slots 能提供类似于区块和布局的好处;不过,一些人可能发现组件和 slots 更容易理解。首先,让我们假设一个会在我们应用中重复使用的「警告」组件:
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
{{ $slot }}
</div>
{{ $slot }}
变量将包含我们希望注入到组件的内容。现在,我们可以使用 @component
指令来构造这个组件:
@component('alert')
<strong>哇!</strong> 出现了一些问题!
@endcomponent
有些时候它对于定义组件的多个 slots 是非常有帮助的。让我们修改我们的警告组件,让它支持注入一个「标题」。 已命名的 slots 将显示「相对应」名称的变量的值:
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
<div class="alert-title">{{ $title }}</div>
{{ $slot }}
</div>
现在,我们可以使用 @slot
指令注入内容到已命名的 slot 中,任何没有被 @slot
指令包裹住的内容将传递给组件中的 $slot
变量:
@component('alert')
@slot('title')
拒绝
@endslot
你没有权限访问这个资源!
@endcomponent
传递额外的数据给组件
有时候你可能需要传递额外的数据给组件。为了解决这个问题,你可以传递一个数组作为第二个参数传递给 @component
指令。所有的数据都将以变量的形式传递给组件模版:
@component('alert', ['foo' => 'bar'])
...
@endcomponent
显示数据
你可以使用 「中括号」 包住变量以显示传递至 Blade 视图的数据。如下面的路由设置:
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
});
你可以像这样显示 name
变量的内容:
Hello, {{ $name }}.
当然也不是说一定只能显示传递至视图的变量内容。你也可以显示 PHP 函数的结果。事实上,你可以在 Blade 中显示任意的 PHP 代码:
The current UNIX timestamp is {{ time() }}.