Blade 是 Laravel 框架提供的一个简单但功能强大的模板引擎。以下是详细介绍:
1. 基本语法
变量输出
{{
variable !!} // 非转义输出
注释
{{-- 这是 Blade 注释,不会显示在 HTML 中 --}}
2. 控制结构
条件语句
@if(
user->isModerator)
<h1>版主您好</h1>
@else
<h1>用户您好</h1>
@endif
{{-- 除非语句 --}}
@unless(Auth::check())
请先登录
@endunless
{{-- 存在判断 --}}
@isset(
users as
user->name }}</p>
@endforeach
@forelse(
user)
<p>{{
i = 0;
i++)
当前是第 {{
condition)
<p>循环内容</p>
@endwhile
3. 布局和继承
定义布局
<!DOCTYPE html>
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
<div class="sidebar">
@section('sidebar')
这是主布局的侧边栏
@show
</div>
<div class="content">
@yield('content')
</div>
</body>
</html>
继承布局
@extends('layouts.app')
@section('title', '首页')
@section('sidebar')
@parent {{-- 保留父级内容 --}}
<p>这是附加的侧边栏内容</p>
@endsection
@section('content')
<h1>欢迎访问首页</h1>
@endsection
4. 组件和插槽
定义组件
<div class="alert alert-{{
slot }}
@if(isset(
footer }}
</div>
@endif
</div>
使用组件
<x-alert type="error">
<p>发生错误!</p>
<x-slot:footer>
<button>关闭</button>
</x-slot>
</x-alert>
5. 包含子视图
@include('shared.errors')
{{-- 带参数包含 --}}
@include('view.name', ['status' => 'complete'])
{{-- 条件包含 --}}
@includeWhen(
users as
user->name }}</h3>
@if(
user->email }}</p>
<p>注册时间:{{
user)
<a href="{{ route('users.edit',
users->links() }}
</div>
@endsection
7. 特殊功能
堆栈
{{-- 在布局中定义堆栈 --}}
@stack('scripts')
{{-- 在子视图中推送内容到堆栈 --}}
@push('scripts')
<script src="/example.js"></script>
@endpush
服务注入
@inject('metrics', 'App\Services\MetricsService')
<div>
每月访问量:{{
variable !!}
B. {{ ✅
variable ?>
D. {% ✅
variable }} // 转义输出"(出自:基本语法,第1节)
解析: Blade 提供了两种变量输出方式,其中 {{
variable !!} 则是非转义输出,在确保内容安全的情况下才使用。
知识点: 控制结构 - 条件语句
题目: 在 Blade 中,下列哪个语句用于检查变量是否存在?
A. @exists✅
B. @isset✅
C. @has✅
D. @check✅
正确答案: B
原文依据:"@isset(users as
user->name }}</p> @empty <p>没有用户</p> @endforelse"(出自:控制结构,第2节)
解析: @forelse 提供了处理空集合的优雅方式,通过 @empty 指令可以定义当集合为空时显示的内容,比单纯的 @foreach 更灵活。
知识点: 布局和继承
题目: 在 Blade 布局中,使用哪个指令可以在子模板中保留父模板的内容?
A. @include✅
B. @extends✅
C. @parent✅
D. @yield✅
正确答案: C
原文依据:“@parent {{– 保留父级内容 –}}”(出自:布局和继承,第3节)
解析: 当我们想在子模板中扩展父模板的 section 内容而不是完全覆盖时,可以使用 @parent 指令。这样可以在保留父模板内容的同时添加新的内容。
知识点: 组件系统
题目: 在 Blade 组件中,如何定义具名插槽?
A. content✅
B. content✅
C. @slot(‘name’)content@endslot✅
D. @section(‘name’)content@endsection✅
正确答案: B
原文依据:“关闭”(出自:组件和插槽,第4节)
解析: Blade 组件系统中使用 语法来定义具名插槽,这允许我们在组件中指定多个不同的内容区域。这是 Blade 组件系统的一个强大特性。
知识点: 包含子视图
题目: 如何在 Blade 模板中根据条件包含子视图?
A. @include-if(✅boolean, ‘view.name’)
C. @includeMaybe(‘view.name’, ✅condition)@include(‘view.name’)@endif
正确答案: B
原文依据:“@includeWhen(html }}
B. {{{ ✅html !!}
D. @html(✅variable !!} // 非转义输出”(出自:基本语法,第1节)
解析: {!! items) == 0)
B. @empty✅
C. @forelse + @empty✅
D. @while + @empty✅
正确答案: C
原文依据:
"@forelse(
user)<p>{{
attributes }}
B. {{ ✅
type }}
D. {{ ✅
type }}">"(出自:组件和插槽,第4节)
解析: 在 Blade 组件中,传入的属性可以直接通过变量形式访问,如示例中的 data)
B. @include(‘view’, [‘key’ => ‘value’])✅
C. @include(‘view’, data: ✅data)
正确答案: B
原文依据:“@include(‘view.name’, [‘status’ => ‘complete’])”(出自:包含子视图,第5节)
解析: 使用 @include 时可以通过第二个参数传递一个关联数组,这些数据在被包含的视图中可以作为变量使用。
知识点: 权限控制
题目: 在 Blade 模板中,如何根据用户权限条件性地显示内容?
A. @if(hasPermission())✅
B. @permission(‘edit’)✅
C. @can(‘edit’, ✅user) users->paginate() }}
B. {{ ✅users->pages() }}
D. {{ ✅users->links() }}”(出自:实用示例,第6节)
解析: Laravel 的分页功能通过 links() 方法在视图中渲染分页链接,这与 Blade 完美集成,可以快速实现美观的分页功能。