一、Blade 概述
与视图文件紧密关联的就是模板代码,咱们在视图文件中经过模板代码和 HTML 代码结合实现视图的渲染。和不少其余后端语言不一样,PHP 自己就能够当作模板语言来使用,可是这种方式有不少缺点,好比安全上的隐患、容易产生业务逻辑与视图模板的耦合,并且在视图文件中处处使用 <?php
内联代码一点都不优雅,甚至是 ugly code,因此你会看到绝大多数现代框架都会提供一套模板引擎,好比 Smarty,Twig,以及 Laravel 使用的 Blade。php
注:不一样于其余基于 Symfony 的 PHP 框架,Laravel 没有使用 Twig 模板引擎,不过你想要使用的话,能够借助 TwigBridge 扩展包来实现。html
Blade 模板引擎是由 Laravel 框架提供的自有实现,借鉴了 .NET 的 Razor 引擎语法,其语法简洁,易于上手,同时提供了强大而直观的继承模型,并且方便扩展。下面是一个简单的 Blade 模板代码示例:前端
<h1>{{ $group->title }}</h1>
{!! $group->imageHtml() !!}
@forelse ($users as $user)
{{ $user->username }} {{ $user->nickname }}<br>
@empty
该组中没有任何用户
@endforelse
正如你所看到的,Blade 模板引擎有三种常见的语法:vue
经过
{{ }}
渲染 PHP 变量(最经常使用)web经过
{!! !!}
渲染原生 HTML 代码(用于富文本数据渲染)后端经过以
@
做为前缀的 Blade 指令执行一些控制结构和继承、引入之类的操做缓存
下面咱们就来逐一介绍这些语法。安全
注:Blade 模板代码存放在以
.blade.php
后缀结尾的视图文件中,最终会被编译为原生 PHP 代码,并缓存起来,直到视图模板有修改才会再次编译,因此拥有与原生 PHP 几乎一致的性能,这些编译后的代码位于storage/framework/views
目录下。你固然能够在 Blade 模板中使用原生 PHP 代码,可是不建议这么作,若是你非要这么作的话,能够经过 @php 指令引入。前端框架
二、渲染数据
首先咱们来看一下 {{}}
语法,咱们经过经过该语法包裹须要渲染的 PHP 变量,如 {{ $variable }}
,你能够将其类比为 <?php echo $variable; ?>
,可是 Blade 模板代码的功能要更强大,经过 {{}}
语法包裹渲染的 PHP 变量会经过 htmlentities()
方法进行 HTML 字符转义,从而避免相似 XSS 这种攻击,提升了代码的安全性,因此 {{ $variable }}
编译后的最终代码是:微信
<?php echo htmlentities($variable); ?>
可是某些状况下不能对变量中 HTML 字符进行转义,好比咱们在表单经过富文本编辑器编辑后提交的表单数据,这种场景就须要经过 {!! !!}
来包裹待渲染数据了:
{!! $variable !!}
这样编译后的代码就是 <?php echo $variable; ?>
了。
注:对于富文本数据 XSS 攻击防御,能够参考这篇教程:https://xueyuanjun.com/post/9476.html
最后,关于数据变量渲染,咱们还要注意的是,不少前端框架也是经过 {{}}
来输出 JavaScript 变量数据的,好比 Laravel 的好基友 Vue.js 就是,对于这种状况,咱们须要在渲染前端 JavaScript 变量的 {{}}
前面加上 @
前缀,这样,Blade 模板引擎在编译模板代码的时候会跳过带 @
前缀的 {{}}
数据渲染,并将 @
移除从而能够后续执行对应的 JavaScript 框架渲染逻辑:
// Blade 引擎会将其编译为对应的 PHP 代码
{{ $phpData }}
// Blade 引擎编译时会移除 @,保留 {{ $vueData }} 结构
@{{ $vueData }}
若是要注释一段 PHP 代码,能够经过 {{-- 注释内容 --}}
实现。
三、控制结构
Blade 中的控制结构语法和 PHP 大同小异,学习成本几乎为零,不过 Blade 为咱们额外提供了一些有用的辅助变量和方法,方便咱们进行条件判断。
条件语句
@if、@else、@elseif
Blade 模板中的 @if
等价于 PHP 的 <?php if ($condition):
,@else
和 @elseif
依次类推,最后以一个 @endif
收尾:
@if (count($students) === 1)
操场上只有一个同窗
@elseif (count($students) === 0)
操场上一个同窗也没有
@else
操场上有 {{ count($students) }} 个同窗
@endif
和原生 PHP 中的用法一模一样。
@unless
@unless
是 Blade 提供的一个 PHP 中没有的语法,用于表示和 @if
条件相反的条件,@unless($condition)
能够理解为 <?php if (!$condition):
,而后以 @endunless
收尾:
@unless ($user->hasPaid())
用户没有支付
@endunless
@isset、@empty
这两个指令和 PHP 中的 isset()
和 empty()
方法等价:
@isset($records)
// 记录被设置
@endisset
@empty($records)
// 记录为空
@endempty
后面两个都是语法糖,若是你不想记太多东西,不防都用 @if
来实现对应的逻辑了。
@switch
顾名思义,Blade 中的 @switch
指令和 PHP 中的 switch
语句等价,咱们能够经过 @switch
、@case
、@break
、@default
和 @endswitch
指令构建对应逻辑:
@switch($i)
@case(1)
// $i = 1 作什么
@break
@case(2)
// $i = 2 作什么
@break
@default
// 默认状况下作什么
@endswitch
循环结构
@for、@foreach 和 @while
和 PHP 同样,在 Laravel 中,咱们能够经过与之等价的 @for
、@foreach
和 @while
实现循环控制结构,使用语法和 PHP 代码相仿:
// for 循环
@for ($i = 0; $i < $talk->slotsCount(); $i++)
The number is {{ $i }}<br>
@endfor
// foreach 循环
@foreach ($talks as $talk)
{{ $talk->title }} ({{ $talk->length }} 分钟)<br>
@endforeach
// while 循环
@while ($item = array_pop($items))
{{ $item->orSomething() }}<br>
@endwhile
@forelse
这个指令是 PHP 中具有的,能够理解为处理如下 PHP 代码逻辑:
<?php
if ($students) {
foreach ($students as $student) {
// do something ...
}
} else {
// do something else ...
}
在 Blade 模板中咱们可使用 @forelse
指令经过如下代码实现上述逻辑:
@forelse ($students as $student)
// do something ...
@empty
// do something else ...
@endforelse
@foreach 和 @forelse 中的 $loop 变量
在循环控制结构中,咱们要重磅介绍的就是 Blade 模板为 @foreach
和 @forelse
循环结构提供的 $loop
变量了,经过该变量,咱们能够在循环体中轻松访问该循环体的不少信息,而不用本身编写那些恼人的面条式代码,好比当前迭代索引、嵌套层级、元素总量、当前索引在循环中的位置等,$loop
实例上有如下属性能够直接访问:

下面是一个简单的使用示例:
<ul>
@foreach ($pages as $page)
@if ($loop->first)
// 第一个循环迭代
@endif
<li>{{ $loop->iteration }}: {{ $page->title }}
@if ($page->hasChildren())
<ul> @foreach ($page->children() as $child)
<li>{{ $loop->parent->iteration }}. {{ $loop->iteration }}: {{ $child->title }}</li>
@endforeach
</ul>
@endif
</li>
@if ($loop->last)
// 最后一个循环迭代
@endif
@endforeach
</ul>
有了这个 $loop
变量,确实可以帮咱们节省不少重复的逻辑判断和编码工做,推荐使用。
(全文完)
长按下面的二维码,便可订阅学院君最新发布的 Laravel 入门系列教程:
关于本系列教程的更多动态,请点击页面左下角的「阅读原文」连接查看。
本文分享自微信公众号 - xueyuanjun(geekacademy)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。