@include是Blade中用于拼装不依赖布局上下文的纯展示型UI块(如页脚、表单字段)的最轻量方式;它仅做文件包含与变量透传,路径须为resources/views下相对路径且不带.blade.php后缀,参数必须显式传入以防Undefined variable错误。

@include 是 Blade 中最轻量、最直接的子视图复用方式,但它不是万能的——用错场景或传参不当,立刻报 Undefined variable 或渲染空白。
什么时候必须用 @include,而不是 @extends 或 @component
当你需要「拼装」一个不依赖父级布局上下文、也不需要封装逻辑的 UI 块时,@include 是唯一合理选择。比如页脚、表单字段、状态徽章、图表卡片这类纯展示型片段。
- 如果组件要复用但不需要继承主布局(即不涉及
@yield、@section),就别写@extends——否则@yield('content')会找不到定义,整个页面变空 - 如果组件只是 HTML + 少量变量(如
$message、$labels),不用封装成@component——那会多出类定义、注册、属性声明三步,纯属过度设计 -
@include路径必须是resources/views/下的相对路径,不能带.blade.php后缀,也不能以/开头(例如@include('/partials/header')会报错)
@include 传参的三种安全写法和一个高危陷阱
Blade 不做变量存在性检查,所有参数必须显式传入,否则子视图里读到的是 PHP 的 Notice: Undefined variable,严重时导致 JS 报错或页面中断。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 最稳妥:
@include('forms.input', ['name' => 'email', 'value' => old('email')])—— 所有键值对明确写出,无歧义 - 可读性稍差但合法:
@include('alerts.danger', $alertData)—— 要求$alertData是已定义的关联数组,且键名与子视图中变量名严格一致 - 禁止在参数里写复杂表达式:
@include('chart', ['data' => $user->posts()->latest()->first()])是危险操作 —— 数据获取逻辑应前置到控制器,避免模板层执行查询
@includeIf 和 @includeWhen 的真实作用不是“省代码”,而是防崩溃
它们解决的是「变量未定义」导致的渲染失败问题,不是语法糖。
-
@includeIf('partials.nav', $navItems):仅当$navItems存在且为 truthy 值时才包含,否则跳过,不报错 -
@includeWhen($user->is_admin, 'admin.menu'):比@if($user->is_admin) @include('admin.menu') @endif少一层嵌套,也避免空@section被意外渲染出来 - 注意兼容性:
@includeWhen仅 Laravel 5.6+ 支持;老项目用了会抛出Directive not supported -
@includeIf还能用于动态路径:@includeIf('themes.'.$theme.'.header')—— 它先检查文件是否存在,再决定是否加载
为什么子视图里用了 @yield 却没内容?
因为 @include 只做「文件包含 + 变量透传」,它不创建新的 @section 上下文。被包含的文件直接访问父级所有变量,但无法响应 @yield 指令。
- 典型错误:在
components/avatar.blade.php里写了@yield('title'),却指望它从 dashboard.blade.php 中取值 —— 不可能,@yield只在@extends链路中生效 - 如果你真需要上下文隔离(比如防止变量名冲突),改用
@component,或者把逻辑拆到控制器层,用不同变量名传入 - 另一个常见坑:
@include里误用@component语法(如@component('alert') ... @endcomponent)却不传$slot,就会报Undefined variable: $slot

















