直接在子视图首行写@extends('layouts.app'),再用@section('content')包裹内容即可套用布局;前提是layouts/app.blade.php存在且含@yield('content'),名称须严格一致,缓存需手动清除。

直接用 @extends 就行,不需要改控制器、不配全局变量、不写 layout 属性——Laravel 的 Blade 布局机制从 5.x 起就默认走视图继承,硬配反而容易出错。
怎么让新页面套进已有布局里
只要在你的页面视图文件(比如 resources/views/posts/index.blade.php)开头写一行:
@extends('layouts.app')
然后把原来页面的 HTML 内容包进 @section('content') 里即可。前提是 resources/views/layouts/app.blade.php 存在且含 @yield('content') 占位符。
- 路径必须对:
layouts.app对应resources/views/layouts/app.blade.php,不能写成layouts/app或漏掉.blade.php - 如果报错
View [layouts.app] not found,先确认文件存在、拼写大小写一致(Linux 环境区分大小写) - 不要在控制器里设
$this->layout = 'layouts.app'——这是 Laravel 4 时代的写法,5+ 版本已废弃,留着会干扰 Blade 渲染流程
多区块布局怎么加侧边栏或广告位
单靠 @yield('content') 不够灵活?那就加额外区块,比如侧边栏、页头、脚部声明:
在 layouts/app.blade.php 里插入:
@yield('sidebar')
@yield('advertisement', '默认广告')
然后在子视图中按需填充:
@section('sidebar')
<aside>用户菜单 / 快捷入口</aside>
@endsection
@section('advertisement')
@parent
<div class="ad-banner">本期优惠:Blade 模板性能提升 30%</div>
@endsection
-
@parent是关键:它把父模板里默认内容(比如空字符串或占位文案)保留下来,再追加新内容,避免覆盖 - 第二个参数是 fallback,默认值只在子视图完全没定义该区块时才生效;一旦用了
@section('advertisement'),fallback 就不触发 - 别用
@show替代@endsection——@show会立即输出并结束区块,无法被@parent引用
CSS/JS 资源怎么按页面动态注入
全局 CSS/JS 放 和 底部没问题,但某些页面要加专属图表库、富文本编辑器,就得用 @stack + @push:
在布局文件 app.blade.php 的 里加:
@stack('styles')
在某个页面视图里加:
@push('styles')
<link rel="stylesheet" href="https://www.php.cn/link/7cc9dfab96e5f47acc9bb48d36f1cac7'css/chart.css')%20%7D%7D">
@endpush
-
@stack必须在布局中先声明,否则@push的内容会被丢弃,不报错也不渲染 - 同名 stack 可多次
@push,所有内容按顺序合并输出,适合组件化加载资源 - 别在
@section内部直接写<link>标签——它不会自动跑到,而是原样插进@yield('content')区域里,导致样式失效或位置错乱
为什么改了布局文件,页面没更新
Blade 编译后缓存视图,尤其在 APP_ENV=production 下默认永久缓存。本地开发时也常因缓存卡住:
- 执行
php artisan view:clear清掉所有编译缓存 - 如果用了 OPcache(常见于 PHP 8+),还需运行
php artisan opcache:clear(需配置对应扩展) - 修改
layouts/app.blade.php后,哪怕只动一个空格,也要清缓存;否则浏览器看到的仍是旧 HTML 结构 - 注意:Blade 缓存和浏览器缓存无关,强制刷新(Ctrl+F5)没用,必须清服务端视图缓存
最易忽略的一点:@yield 和 @section 名称必须严格一致,大小写、下划线、空格都不能差——Blade 不做容错匹配,错一个字符就静默失败,内容直接消失。











