父模板通过@yield占位符确立,必须至少含@yield('content');子模板首行须为@extends('layouts.app'),且动态内容需包裹在同名@section中;多处注入同一区块应改用@push/@stack。

Blade 模板怎么定义父模板(layout.blade.php)
父模板不是靠特殊语法“声明”的,而是靠 @yield 占位符的存在来确立的。没有 @yield,它就只是普通模板,没法被继承。
常见错误是写完 layouts/app.blade.php 后直接用 @include 引入子内容——这不算继承,只是拼接,无法实现区块替换。
- 必须至少有一个
@yield('content'),这是子模板能注入内容的唯一入口 - 可额外定义命名区块,比如
@yield('sidebar')或@yield('scripts'),方便按需覆盖 - 父模板里可以混用静态 HTML、
@section(带默认内容)、@show,但注意:只有@yield是强制必需的继承锚点 - 路径别写错:
resources/views/layouts/app.blade.php是标准位置,Laravel 不会自动从其他目录找父模板
子模板怎么正确 extends 父模板
@extends 必须是子模板的第一条指令,前面不能有任何空格、换行或 PHP 输出(包括 BOM)。否则报错 Unexpected token " 或页面空白,且无明确提示。
典型场景:你写了 home.blade.php,想复用 app.blade.php 的结构,但页面直接崩了——大概率是开头有空格或用了 @include 代替 @extends。
- 第一行只能是
@extends('layouts.app'),路径用点号分隔,不加.blade.php - 所有动态内容必须包在
@section('content')...@endsection里,名字要和父模板@yield的参数完全一致(区分大小写) - 如果父模板用了
@yield('scripts', 'default-js'),子模板可以用@section('scripts')@parent继承默认内容再追加,但@parent必须显式写出,不会自动合并 - 不要在子模板里写
@section以外的裸 HTML——它会被忽略或错位渲染
为什么 @section(...)->@yield(...) 不生效
最常踩的坑是混淆了 @section 和 @push/@stack 的行为:前者只支持单次定义,后者才支持多次追加。如果你在多个子模板或组件里重复定义同名 @section,只有最后一个生效。
比如你在 layouts/app.blade.php 里写了 @yield('styles'),又在 user/index.blade.php 和 user/edit.blade.php 中都写了 @section('styles'),但只看到其中一个的 CSS 加载了——这不是 Bug,是设计如此。
- 需要多处注入同一区块时,改用
@push('styles')+@stack('styles') -
@section内容在视图编译时就被锁定,不支持运行时叠加;@push是运行时收集,适合 JS/CSS 按需加载 - 检查是否漏了
@endsection或@endpush,漏掉会导致后续所有 Blade 指令解析失败,整页白屏 - Blade 编译缓存有时会卡住旧逻辑,遇到“改了没反应”,先清缓存:
php artisan view:clear
部署时 Blade 模板不更新或报错
线上环境默认开启 Blade 缓存,本地开发时改了模板立刻生效,部署后却还是旧页面——不是代码没传上去,而是 storage/framework/views/ 下的编译文件没刷新。
另一个高频问题是权限:Web 服务器用户(如 www-data)没权限写入 storage/ 目录,导致编译失败,报错类似 file_put_contents(/var/www/storage/framework/views/xxx.php): failed to open stream。
- 上线后务必执行
php artisan view:cache(生产环境)或至少php artisan view:clear再试 - 确保
storage/和bootstrap/cache/可写,Linux 下常用:chmod -R 775 storage bootstrap/cache,并确认属组正确 - 不要把
resources/views/下的 .blade.php 文件当成纯 HTML 直接扔进 Nginx 静态目录——它们必须经 Laravel 路由和视图引擎处理 - 如果用 Envoyer、Envoy 或 CI/CD 部署,记得在部署脚本末尾加入
view:clear或view:cache步骤
Blade 继承看着简单,真正卡住人的往往不是语法,而是那几个看不见的约束:第一行不能空、@yield 必须存在、缓存不手动清就不会更新、权限不对就死在写文件那步。这些地方一错,连报错信息都不友好,得靠经验快速定位。


















