应采用单层继承+组件化拆分:以layouts.app为唯一父模板,用@component/@include复用区块;避免多层继承、深层@section嵌套及@foreach超过两层;数据预处理、权限判断等逻辑须在controller完成。
Blade模板继承与@yield/@section怎么避免嵌套过深
Blade本身不支持多层模板继承(比如 A extends B,B extends C),强行套用会导致 @yield 找不到定义、渲染空白或报错 Undefined variable: __env。真正简洁的做法是「单层继承 + 组件化拆分」。
推荐结构:layouts.app 为唯一父模板,所有页面用 @extends('layouts.app');重复区块(如表单头部、数据表格操作栏)抽成 @component 或 @include 子视图。
- 不要写
@extends('layouts.base')→@extends('layouts.admin')这类链式继承 -
@section内容尽量只放当前页面强相关逻辑,避免塞入大量 HTML 结构 - 若需动态控制某区块是否渲染,用
@isset($slot)或传参判断,而非嵌套@if+@section
组件(Component)替代@include时的命名与参数陷阱
用 php artisan make:component Alert 生成的组件默认使用 <x-alert></x-alert> 标签,但实际高频出错点在属性传递和 slot 处理。
常见问题:传布尔值失败(<x-alert type="danger"></x-alert> 中 type 是字符串,不是布尔)、slot 内容被忽略(没写 {{ $slot }})、匿名组件路径错误(未按 resources/views/components/ 存放)。