Blade 简介
Blade 是由 Laravel 提供的非常简单但功能强大的模板引擎,不同于其他流行的 PHP 模板引擎,Blade 在视图中并不约束你使用 PHP 原生代码。所有的 Blade 视图最终都会被编译成原生 PHP 代码并缓存起来直到被修改,这意味着对应用的性能而言 Blade 基本上是零开销。
Blade 视图文件(也叫模板文件)使用 .blade.php 文件扩展名,都存放在 resources/views 目录下。
模板继承
定义布局
使用 Blade 的两个最大优点是模板继承和片段组合,开始之前让我们先看一个例子。
首先,我们测试主页面布局,由于大多数 Web 应用在不同页面中使用同一个布局,可以很方便的将这个布局定义为一个单独的 Blade 页面。
在 resources/views/layouts 目录中,创建一个布局文件 layout.blade.php,内容如下:
<html>
<head>
<title>应用名称 - @yield('title')</title>
</head>
<body>
@section('sidebar')
这里是侧边栏
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
该文件包含典型的 HTML 标记,不过,注意 @section 和 @yield 指令,前者定义了一个内容片段,而后者用于显示给定片段的内容。
现在我们已经为应用定义了一个布局,接下来定义继承该布局的子页面。
继承布局
定义子页面时,可以使用 Blade 的 @extends 指令来指定子页面所继承的布局,继承一个 Blade 布局的视图可以使用 @section 指令注入内容到布局定义的内容片段中。
如上面例子所示,这些片段的内容将会显示在布局中使用 @yield 的地方。
在 resources/views 目录中,创建视图文件 child.blade.php,内容如下:
@extends('layouts.layout')
@section('title', '视图标题')
@section('sidebar')
@parent
<p>这是子页面的内容</p>
@endsection
@section('content')
<p>这里是主体内容,完善中...</p>
@endsection
在本例中,sidebar 片段使用 @parent 指令来追加(而非覆盖)内容到布局的侧边栏,@parent 指令在视图渲染时将会被布局中的内容替换。
然后,在 routes/web.php 中定义路由以便访问该视图。
Route::get('blade', function () {
return view('child');
});
在浏览器中访问 http://www.adm.devp/blade ,查看显示效果。
组件&插槽
组件和插槽给内容片段(section)和布局(layout)带来了方便,不过,有些人可能会发现组件和插槽的模型更容易理解。
首先,我们假设有一个可复用的“alert”组件,我们想要在整个应用中都可以复用它。
创建 resources/views/alert.blade.php 文件,内容如下:
<div class="alert alert-danger">
{
{ $slot }}
</div>
{ { $slot }} 变量包含了我们想要注入组件的内容,现在,要构建这个组件,我们可以使用 Blade 指令 @component。
@component('alert')
<strong>Whoops!</strong> Something went wrong!
@endcomponent
有时,为组件定义多个插槽很有用。下面我们来编辑 alert 组件。
修改 resources/views/alert.blade.php 文件:
<div class="alert alert-danger">
<div class="alert-title">{
{ $title }}</div>
{
{ $slot }}
</div>
现在,我们