blade模板必须满足路径、后缀、继承结构三重约束:文件须置于resources/views/下且以.blade.php为后缀;视图名用点号分隔子目录(如admin.dashboard);@extends与@section须严格配对、大小写一致;{{}}默认转义,{!!}}禁用转义需谨慎;缓存未清会导致修改不生效。

Blade 模板不是“写完就能跑”的纯 HTML,它必须满足路径、后缀、继承结构三重约束,否则 view() 会直接报 View [xxx] not found 或页面空白。
文件必须放对位置且用对后缀
Blade 文件只能放在 resources/views/ 下,且后缀严格为 .blade.php。Laravel 不扫描 app/Views/、views/(根目录)、public/views/ 等任何其他路径。
-
resources/views/welcome.blade.php→ 可通过return view('welcome')加载 -
resources/views/admin/dashboard.blade.php→ 视图名是admin.dashboard,不是admin/dashboard - 命名含空格或中文(如
user list.blade.php)会导致解析失败,应改为user_list.blade.php - 存成
login.php或index.html:Blade 指令(如@if)完全不生效,只当普通 PHP/HTML 输出
@extends 和 @section 必须严格配对
布局继承失效最常见的原因是名字不一致、顺序错乱或闭合遗漏,错误不会抛异常,而是静默失败(如内容不显示、__env 报错、页面空白)。
- 父模板用
@yield('content'),子模板就必须写@section('content')—— 大小写、拼写、引号内字符串必须一字不差 -
@section必须在@extends之后、@endsection之前;不能包在@if或@foreach里再开@section - 不要用已弃用的
@stop替代@endsection(Laravel 5.8+ 会警告) - 想追加而非覆盖内容(比如往
scripts区域加 JS),用@push('scripts')+@stack('scripts'),别反复写同名@section
{{ }} 和 {!! }} 的转义差异必须分清
双大括号默认调用 htmlspecialchars(),这是安全底线;但误用 {!! !!} 是 XSS 高危操作,仅限你 100% 确认内容可信时使用。
-
{{ $title }}→ 安全输出,<script>alert(1)</script>会被转义成纯文本 -
{!! $html_content !!}→ 原样渲染,富文本编辑器输出、Markdown 渲染结果等可走此路,但绝不用于用户提交的任意字段 - JavaScript 中嵌入变量要用
{{ $id }},不是<?php echo $id; ?>,也别漏掉引号:var id = '{{ $id }}';
@if 和 @isset 对 “空值” 的判断逻辑完全不同
用错条件指令会导致数据存在却渲染不出,尤其在处理 ID=0、金额=0、空字符串等边界值时。
-
@if($id)等价于 PHP 的if ($id),所以$id === 0或$id === ''都为 false,直接跳过 -
@isset($id)只检查变量是否已声明且不为null,0和''都返回 true - 集合判空优先用
@forelse($items as $item)或@empty($items),比@if($items->count())更轻量、语义更准 - 复杂判断(如多条件组合、状态机)别堆在 Blade 里,提前在 Controller 计算好布尔标志再传入
最常被忽略的是缓存:改了 .blade.php 却没刷新页面?先跑 php artisan view:clear。Blade 编译后的 PHP 文件存在 storage/framework/views/,修改模板后若无变化,90% 是缓存没清。











