Blade指令 #
一、指令概述 #
Blade指令以 @ 符号开头,提供了丰富的模板功能。
text
Blade指令分类
├── 控制结构
│ ├── @if, @elseif, @else
│ ├── @for, @foreach, @while
│ └── @switch
├── 包含指令
│ ├── @include
│ ├── @each
│ └── @yield
├── 布局指令
│ ├── @extends
│ ├── @section
│ └── @parent
├── 辅助指令
│ ├── @csrf
│ ├── @method
│ └── @error
└── 自定义指令
二、控制结构指令 #
2.1 条件指令 #
blade
<!-- @if 系列 -->
@if($condition)
条件为真
@elseif($anotherCondition)
另一个条件为真
@else
条件为假
@endif
<!-- @unless -->
@unless($condition)
条件为假时显示
@endunless
<!-- @isset -->
@isset($variable)
变量已设置
@endisset
<!-- @empty -->
@empty($array)
数组为空
@endempty
<!-- @auth / @guest -->
@auth
已登录
@endauth
@guest
未登录
@endguest
<!-- 指定守卫 -->
@auth('admin')
管理员已登录
@endauth
2.2 循环指令 #
blade
<!-- @for -->
@for($i = 0; $i < 10; $i++)
第 {{ $i }} 次
@endfor
<!-- @foreach -->
@foreach($users as $user)
{{ $user->name }}
@endforeach
<!-- @forelse -->
@forelse($posts as $post)
{{ $post->title }}
@empty
没有文章
@endforelse
<!-- @while -->
@while($condition)
循环内容
@endwhile
<!-- 循环控制 -->
@foreach($users as $user)
@if($user->blocked)
@continue
@endif
@if($user->isAdmin)
@break
@endif
{{ $user->name }}
@endforeach
<!-- 带条件的循环控制 -->
@foreach($users as $user)
@continue($user->blocked)
@break($user->isAdmin)
{{ $user->name }}
@endforeach
2.3 switch指令 #
blade
@switch($status)
@case('active')
<span class="badge badge-success">激活</span>
@break
@case('pending')
<span class="badge badge-warning">待审核</span>
@break
@case('inactive')
<span class="badge badge-secondary">未激活</span>
@break
@default
<span class="badge badge-dark">未知</span>
@endswitch
三、包含指令 #
3.1 @include #
blade
<!-- 基本包含 -->
@include('partials.header')
<!-- 传递数据 -->
@include('partials.user-card', ['user' => $user])
<!-- 条件包含 -->
@includeIf('partials.sidebar')
<!-- 当条件为真时包含 -->
@includeWhen($showFooter, 'partials.footer')
<!-- 当条件为假时包含 -->
@includeUnless($hideAds, 'partials.ads')
<!-- 包含第一个存在的视图 -->
@includeFirst(['custom.header', 'partials.header'])
3.2 @each #
blade
<!-- 渲染集合 -->
@each('partials.user-card', $users, 'user')
<!-- 带空视图 -->
@each('partials.user-card', $users, 'user', 'partials.empty-users')
3.3 @once #
blade
@once
<script>
// 只执行一次的代码
</script>
@endonce
四、表单指令 #
4.1 @csrf #
blade
<form method="POST" action="/users">
@csrf
<!-- 表单字段 -->
</form>
4.2 @method #
blade
<form method="POST" action="/users/1">
@method('PUT')
@csrf
<!-- 表单字段 -->
</form>
4.3 @error #
blade
<!-- 检查是否有错误 -->
@error('email')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
<!-- 指定错误包 -->
@error('email', 'login')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
五、堆栈指令 #
5.1 @push和@stack #
blade
<!-- 定义堆栈位置 -->
<head>
@stack('scripts')
</head>
<!-- 向堆栈添加内容 -->
@push('scripts')
<script src="/example.js"></script>
@endpush
<!-- 添加到堆栈开头 -->
@prepend('scripts')
<script src="/important.js"></script>
@endprepend
5.2 实际应用 #
blade
<!-- 布局文件 -->
<!DOCTYPE html>
<html>
<head>
<title>@yield('title')</title>
@stack('head')
</head>
<body>
@yield('content')
<script src="/app.js"></script>
@stack('scripts')
</body>
</html>
<!-- 页面文件 -->
@extends('layouts.app')
@push('head')
<link href="/page.css" rel="stylesheet">
@endpush
@push('scripts')
<script src="/page.js"></script>
@endpush
@section('content')
页面内容
@endsection
六、辅助指令 #
6.1 @php #
blade
@php
$total = 0;
foreach($items as $item) {
$total += $item->price;
}
@endphp
<p>总价: {{ $total }}</p>
6.2 @class #
blade
<div @class([
'alert',
'alert-success' => $success,
'alert-danger' => $error,
'alert-warning' => $warning,
])>
消息内容
</div>
6.3 @style #
blade
<div @style([
'color: red',
'font-weight: bold' => $important,
'text-align: center' => $centered,
])>
文本内容
</div>
6.4 @checked #
blade
<input type="checkbox" @checked($user->active)>
6.5 @selected #
blade
<select name="status">
<option value="active" @selected($user->status === 'active')>激活</option>
<option value="inactive" @selected($user->status === 'inactive')>禁用</option>
</select>
6.6 @disabled #
blade
<button @disabled($formSubmitted)>提交</button>
6.7 @readonly #
blade
<input type="text" @readonly($user->isLocked)>
6.8 @required #
blade
<input type="text" @required($field->required)>
七、JavaScript指令 #
7.1 @json #
blade
<script>
var user = @json($user);
var settings = @json([
'theme' => 'dark',
'lang' => 'zh',
]);
</script>
7.2 @verbatim #
blade
@verbatim
<div>
{{ 这不会被Blade处理 }}
{{ $variable }}
</div>
@endverbatim
八、生产指令 #
8.1 @production #
blade
@production
<!-- 只在生产环境显示 -->
<script>
// 生产环境分析代码
</script>
@endproduction
8.2 @env #
blade
@env('local')
<!-- 只在本地环境显示 -->
<div class="debug-info">
调试信息
</div>
@endenv
@env(['local', 'staging'])
<!-- 在本地和测试环境显示 -->
@endenv
九、自定义指令 #
9.1 注册自定义指令 #
php
// app/Providers/AppServiceProvider.php
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('Y-m-d H:i:s'); ?>";
});
Blade::directive('money', function ($expression) {
return "<?php echo number_format($expression, 2); ?>";
});
}
9.2 使用自定义指令 #
blade
<p>日期: @datetime($post->created_at)</p>
<p>金额: @money($order->total)</p>
9.3 自定义if语句 #
php
Blade::if('admin', function () {
return auth()->check() && auth()->user()->isAdmin();
});
Blade::if('role', function ($role) {
return auth()->check() && auth()->user()->hasRole($role);
});
blade
@admin
<p>管理员内容</p>
@endadmin
@role('editor')
<p>编辑内容</p>
@endrole
9.4 自定义组件标签 #
php
Blade::component('components.alert', 'alert');
blade
<x-alert type="success">
操作成功
</x-alert>
十、常用自定义指令示例 #
10.1 格式化指令 #
php
// 日期格式化
Blade::directive('date', function ($expression) {
return "<?php echo ($expression)->format('Y-m-d'); ?>";
});
// 时间格式化
Blade::directive('time', function ($expression) {
return "<?php echo ($expression)->format('H:i:s'); ?>";
});
// 货币格式化
Blade::directive('currency', function ($expression) {
return "<?php echo '¥' . number_format($expression, 2); ?>";
});
10.2 条件指令 #
php
// 检查权限
Blade::if('can', function ($permission) {
return auth()->check() && auth()->user()->can($permission);
});
// 检查订阅
Blade::if('subscribed', function () {
return auth()->check() && auth()->user()->subscribed();
});
blade
@can('edit-posts')
<a href="/posts/create">创建文章</a>
@endcan
@subscribed
<p>高级功能</p>
@elsesubscribed
<a href="/subscribe">订阅</a>
@endsubscribed
10.3 辅助指令 #
php
// 截断文本
Blade::directive('truncate', function ($expression) {
return "<?php echo Str::limit($expression, 100); ?>";
});
// 安全输出
Blade::directive('safe', function ($expression) {
return "<?php echo e($expression); ?>";
});
十一、指令最佳实践 #
11.1 避免复杂逻辑 #
blade
{{-- 不推荐 --}}
@if(User::where('active', 1)->count() > 0)
...
@endif
{{-- 推荐:在控制器中处理 --}}
@if($hasActiveUsers)
...
@endif
11.2 使用组件替代复杂指令 #
blade
{{-- 不推荐:复杂的自定义指令 --}}
@formatUser($user, ['showEmail' => true, 'showPhone' => false])
{{-- 推荐:使用组件 --}}
<x-user-card :user="$user" show-email />
11.3 合理使用@once #
blade
{{-- 只需要执行一次的代码 --}}
@once
<script>
// 初始化代码
</script>
@endonce
十二、指令性能优化 #
12.1 视图缓存 #
bash
# 缓存视图
php artisan view:cache
# 清除视图缓存
php artisan view:clear
12.2 避免运行时计算 #
php
// 不推荐
Blade::directive('users', function () {
return "<?php echo App\Models\User::count(); ?>";
});
// 推荐:在控制器中传递数据
return view('dashboard', ['userCount' => User::count()]);
十三、总结 #
13.1 核心指令 #
| 指令 | 用途 |
|---|---|
| @if/@else/@endif | 条件判断 |
| @foreach/@endforeach | 循环遍历 |
| @include | 包含视图 |
| @push/@stack | 堆栈管理 |
| @csrf | CSRF保护 |
| @method | 表单方法伪装 |
| @error | 错误显示 |
13.2 自定义指令 #
| 方法 | 用途 |
|---|---|
| Blade::directive() | 自定义指令 |
| Blade::if() | 自定义条件 |
| Blade::component() | 注册组件 |
13.3 下一步 #
掌握了Blade指令后,让我们继续学习 数据库配置,了解Laravel数据库操作!
最后更新:2026-03-28