
在 Laravel Blade 中,不能通过 @extends 直接继承并访问另一模板中定义的 PHP 变量;正确方式是使用 @include 导入模板以共享变量作用域,或通过控制器统一传递数据。
在 laravel blade 中,不能通过 `@extends` 直接继承并访问另一模板中定义的 php 变量;正确方式是使用 `@include` 导入模板以共享变量作用域,或通过控制器统一传递数据。
Blade 模板引擎的设计遵循“模板继承”与“组件复用”分离原则:@extends 用于构建布局层级(父模板 → 子模板),其作用域不共享 PHP 变量;而 @include 则是在当前模板作用域内嵌入另一模板,支持变量透传——这才是实现跨文件变量复用的推荐方式。
✅ 正确做法:使用 @include 共享变量
假设你有一个存放共享变量的模板 resources/views/partials/data.blade.php:
@php
$myVariable = 'xyz';
$siteConfig = [
'name' => 'MyApp',
'version' => '1.0.0'
];
@endphp
在 home.blade.php 中,通过 @include 引入它(注意:无需 .blade.php 后缀,且路径按目录结构省略 resources/views/):
{{-- 引入变量定义文件,使其在当前作用域生效 --}}
@include('partials.data')
@extends('layouts.app')
@section('content')
<h1>Welcome to {{ $siteConfig['name'] }} v{{ $siteConfig['version'] }}</h1>
<p>Shared variable: {{ $myVariable }}</p>
@endsection
此时 $myVariable 和 $siteConfig 均可直接使用,因为 @include 本质是 PHP require 的封装,会将被包含文件的代码执行在当前作用域中。
❌ 错误做法解析
- @extends('data') 试图将 data.blade.php 当作布局模板,但该文件不含 @yield(),也不符合继承契约,导致语法无效且变量不可见;
- Blade 继承机制仅传递 @section 内容,不传递 PHP 变量,这是由其编译原理决定的(父模板编译后独立执行,子模板注入内容,无作用域合并)。
? 更优实践:控制器统一注入(推荐)
对于业务相关变量,应优先通过控制器传递,保障逻辑清晰与可测试性:
// app/Http/Controllers/HomeController.php
public function index()
{
return view('home', [
'myVariable' => 'xyz',
'siteConfig' => ['name' => 'MyApp', 'version' => '1.0.0']
]);
}
视图中直接使用:
<h1>{{ $myVariable }}</h1>
<p>{{ $siteConfig['name'] }}</p>
⚠️ 注意事项
- @include 支持传参(如 @include('partials.data', ['override' => true])),可用于动态定制;
- 避免在 @include 文件中使用 @section 或 @extends,否则可能引发渲染异常;
- 共享变量模板建议放在 resources/views/partials/ 下,语义明确且便于维护;
- 若变量需全局可用(如站点标题、用户信息),可结合 View::share() 或服务容器绑定,但需谨慎控制作用域。
总之,Blade 中变量共享不是靠“继承”,而是靠“包含”或“显式传递”。理解这一设计哲学,才能写出清晰、可维护的模板结构。











