控制结构
控制结构
除了模板继承和数据显示, Blade 还为分支和循环等 PHP 控制结构提供了方便的快捷方式。这些快捷方式提供了干净、简捷地处理 PHP 控制结构的方法,同时保持了与 PHP 中的对应结构的相似性。
If 语句
可以使用 @if、 @elseif、 @else 和 @endif 指令构造 if 语句。这些指令的功能与相应的 PHP 指令相同:
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
方便起见, Blade 还提供了 @unless 指令:
@unless (Auth::check())
You are not signed in.
@endunless
除了已经讨论过的条件指令, @isset 和 @empty 指令可以作为各自对应的 PHP 函数的快捷方式:
@isset($records)
// $records 被定义且不是 null...
@endisset
@empty($records)
// $records 为空...
@endempty
身份验证指令
@auth 和 @guest 指令能够用于快速确定当前用户是经过身份验证的,还是一个访客:
@auth
// 此用户身份已验证...
@endauth
@guest
// 此用户身份未验证...
@endguest
如果需要,可以在使用 @auth 和 @guest 指令时指定应被校验的 身份 :
@auth('admin')
// 此用户身份已验证...
@endauth
@guest('admin')
// 此用户身份未验证...
@endguest
片段指令
可以使用 @hasSection 指令检查片断是否存在内容:
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
<div class="clearfix"></div>
@endif
Switch 指令
可以使用 @switch、 @case、 @break、 @default 和 @endswitch 指令构造 switch 语句:
@switch($i)
@case(1)
First case...
@break
@case(2)
Second case...
@break
@default
Default case...
@endswitch
循环
除了分支语句,Blade 还提供了与 PHP 的循环结构相同的简化指令。这些指令的功能也与相应的 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'm looping forever.</p>
@endwhile
{tip} 循环中可以使用 循环变量 获取循环的可评估信息,比如现在是处于循环的第一次迭代还是最后一次迭代中:
在循环中,还可以终结循环或路过本次迭代:
@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
循环变量
循环过程中,在循环体内有一个可用的 $loop 变量。该变量提供了用于访问诸如当前循环的索引、当前是否为第一次或最后一次循环之类的少数有用的信息的途径:
@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
在嵌套循环中,可以借助 parent 属性访问父循环的 $loop 变量:
@foreach ($users as $user)
@foreach ($user->posts as $post)
@if ($loop->parent->first)
This is first iteration of the parent loop.
@endif
@endforeach
@endforeach
$loop 变量还包含其它几种有用的属性:
属性 | 描述 |
---|---|
$loop->index | 当前迭代的索引(从 0 开始计数)。 |
$loop->iteration | 当前循环迭代 (从 1 开始计算)。 |
$loop->remaining | 循环中剩余迭代的数量。 |
$loop->count | 被迭代的数组元素的总数。 |
$loop->first | 是否为循环的第一次迭代。 |
$loop->last | 是否为循环的最后一次迭代。 |
$loop->depth | 当前迭代的嵌套深度级数。 |
$loop->parent | 嵌套循环中,父循环的循环变量 |
注释
Blade 也允许在视图中定义注释。不过与 HTML 注释不同,Blade 注释不会包含在返回给应用的 HTML 中:
{{-- This comment will not be present in the rendered HTML --}}
PHP
某些情况下,在视图中嵌入 PHP 代码很有用。可以在模板中使用 @php 指令执行原生的 PHP 代码块:
@php
//
@endphp
{tip} 尽管 Blade 提供了这个特性,但频繁使用意味着模板中嵌入了过多的逻辑。