一、简介
Blade 是 Laravel 提供的一个简单而又强大的模板引擎。 和其他流行的 PHP 模板引擎不同,Blade 并不限制你在视图中使用原生 PHP 代码。实际上,所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何负担。Blade 模板文件使用 .blade.php 作为文件扩展名,被存放在larvel的 resources/views 目录中。 Blade 视图可以使用全局 view 函数从 Route 或控制器返回
二、Blade模板的使用
(1)最基本的使用(HTML中)
html
Hello, {{ $name }}
$name 为路由或者控制器向视图文件发送的数据,我们使用{ { } }包裹起来可以直接使用其值。我们可以将任何需要使用的值,传递给balde模板。
特别提醒:{ { } }包裹的数据,会被被 PHP 的 htmlspecialchars 函数自动转义以防范 XSS 攻击。
默认情况下, Blade { { } } 语句将被 PHP 的 htmlspecialchars 函数自动转义以防范 XSS 攻击。如果不想您的数据被转义,那么您可使用如下的语法:
html
Hello, {!! $name !!}
(2)blade模板在Javascript中的使用
内联方式:在 Blade 模板中,当你需要将一个 PHP 变量传递到 JavaScript 中时,可以直接在 JavaScript 代码块中输出变量。例如,如果你有一个 Blade 变量$user_id,你可以这样在 JavaScript 中使用:
html
<script>
var userId = '{{ $user_id }}';
console.log(userId);
</script>
三、Blade指令***
(1)If 语句
如果使用指令语句,我们可以直接使用blade中的变量,不再需要使用{ { } }包裹起来
html
@if (count($records) === 1)
// 有一条记录
@elseif (count($records) > 1)
// 有多条记录
@else
// 没有记录
@endif
html
@unless (Auth::check())
// 还没有登录
@endunless
除了上面条件指令外, 亦可作为它们所对应的 PHP 函数的快捷方式:@isset @empty
html
@isset($records)
// $records 已经被定义且不为 null ......
@endisset
@empty($records)
// $records 为「空」......
@endempty
(2)switch语句
您可使用 @switch、@case、@break、@default和@endswitch语句来构造 Switch 语句:
html
@switch($i)
@case(1)
First case...
@break
@case(2)
Second case...
@break
@default
Default case...
@endswitch
(3)循环
Blade 还提供了与 PHP 循环结构功能相同的指令。 同样,这些语句的功能和它们所对应的 PHP 语法一致:
html
@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'm looping forever.</p>
@endwhile
使用循环时,还可以使用 和 循环或跳过当前迭代:@continue @break
html
@foreach ($users as $user)
@if ($user->type == 1)
@continue
@endif
<li>{{ $user->name }}</li>
@if ($user->number == 5)
@break
@endif
@endforeach
您还可以在指令声明中包含继续或中断条件:
html
@foreach ($users as $user)
@continue($user->type == 1)
<li>{{ $user->name }}</li>
@break($user->number == 5)
@endforeach
(4)Loop变量
在遍历 循环时,循环内部可以使用 变量。 该变量提供了访问一些诸如当前的循环索引和此次迭代是首次或是末次这样的信息的方式:foreach $loop
html
@foreach ($users as $user)
@if ($loop->first)
This is the first iteration.
@endif
@if ($loop->last)
This is the last iteration.
@endif
<p>This is user {{ $user->id }}</p>
@endforeach
如果是嵌套循环,可以使用循环的 变量的 属性访问父级循环:$loop->parent
html
@foreach ($users as $user)
@foreach ($user->posts as $post)
@if ($loop->parent->first)
This is the first iteration of the parent loop.
@endif
@endforeach
@endforeach
该变量还包含各种各样有用的属性
属性 | 描述 |
---|---|
$loop->index | 当前迭代的索引(从 0 开始) |
$loop->iteration | 当前循环的迭代次数(从 1 开始) |
$loop->remaining | 循环剩余的迭代次数 |
$loop->count | 被迭代的数组的元素个数 |
$loop->first | 当前迭代是否是循环的首次迭代 |
$loop->last | 当前迭代是否是循环的末次迭代 |
$loop->even | 当前循环的迭代次数是否是偶数 |
$loop->odd | 当前循环的迭代次数是否是奇数 |
$loop->depth | 当前循环的嵌套深度 |
$loop->parent | 嵌套循环中的父级循环 |
(5)选中与禁用
为方便起见,您可以使用该@checked指令轻松判断给定的 HTML 复选框输入是否被「checked」。 如果提供的条件判断为true ,则此指令将回显 :checked
html
<input type="checkbox"
name="active"
value="active"
@checked(old('active', $user->active)) />
同样,该 @selected指令可用于判断给定的选项是否被「selected」:
html
<select name="version">
@foreach ($product->versions as $version)
<option value="{{ $version }}" @selected(old('version') == $version)>
{{ $version }}
</option>
@endforeach
</select>
此外,该@disabled 指令可用于判断给定元素是否为「disabled」:
html
<button type="submit" @disabled($errors->isNotEmpty())>Submit</button>
(6)request对象
在 Laravel 的 Blade 模板中,{{ request }}是一个包含当前HTTP请求相关信息的对象。它是Illuminate\Http\Request 类的一个实例。这个对象提供了访问请求的各种属性的途径,如请求的 URL、查询字符串、请求头信息、路由参数等诸多内容。
- 获取完整的 URL:可以使用{{ request - > fullUrl() }}来获取当前请求的完整URL。例如,当用户访问example.com/products?ca...
- 获取请求的路径部分(不包括域名和查询字符串):使用{{ request - > path() }}。对于上面的例子,它将返回/products。
- 获取请求的路由名称(如果有):如果你的应用程序使用了命名路由,可以通过{{ request - > route() - >getName() }}来获取当前请求所匹配的路由名称。这在根据不同的路由显示不同的导航链接状态等场景下很有用。
- 假设当前 URL 是example.com/search?q=la... request - > input('q') }}来获取查询字符串中q的值,在这里就是laravel。
- 如果你想获取所有的查询字符串参数作为一个数组,可以使用{{ request - > all()['q'] }}(这和上面的input方法在获取单个参数时功能类似,但all方法返回所有参数的数组)。
四、安全相关
无论何时在应用程序中定义 HTML 表单,都应该在表单中包含一个隐藏的 CSRF 令牌字段,以便 CSRF 保护中间件 可以验证请求。 你可以使用 Blade 指令生成令牌字段:@csrf
html
<form method="POST" action="/profile">
@csrf
...
</form>
五、总结
Blade 是 Laravel 强大的模板引擎,其优势在于编译缓存机制不增加应用负担且不限制原生 PHP 代码使用。在基本使用上,可接收路由或控制器传来的数据并以{{ 变量 }}形式展示,可选择转义或不转义。在与 JavaScript 交互时能通过内联方式传递变量。Blade 指令丰富,如@if等条件指令、@switch语句、各类循环指令且循环中有loop变量提供多种循环信息,还有@checked等便捷的选中与禁用指令以及对request对象多属性的访问指令。在安全方面,有@csrf指令用于生成表单隐藏的 CSRF 令牌字段以保障请求安全。总之,Blade 在数据展示、逻辑控制、安全防护等多方面为 Laravel 应用的视图层提供了高效且功能完备的解决方案。