Skip to main content

控制结构

控制结构

除了模板继承和数据显示, 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 提供了这个特性,但频繁使用意味着模板中嵌入了过多的逻辑。