Blade模板继承是Laravel特有功能,依赖ViewServiceProvider、BladeCompiler及完整视图生命周期;纯PHP中无法直接运行,@extends/@section需严格匹配,数据需显式共享,编译缓存需手动清除。

Blade 模板继承不是 PHP 原生功能,它只在 Laravel 框架中可用;直接在纯 PHP 项目里 require 或 include Blade 文件会报错——因为 blade.php 文件根本不会被 PHP 解析,Laravel 的 Illuminate\View\Engines\CompilerEngine 才负责编译它。
Blade 继承必须依赖 Laravel 的视图服务和路由机制
你不能把 resources/views/layouts/app.blade.php 和 resources/views/home.blade.php 拷进一个空 PHP 目录然后用 include 运行。Laravel 启动时注册了 ViewServiceProvider,它绑定 view 实例并配置了 BladeCompiler、缓存路径、组件自动发现等。没有这个上下文,@extends、@section 都只是普通文本。
-
config/view.php中的paths决定了resources/views是否被扫描,改错路径会导致ViewNotFoundException -
APP_DEBUG=true时,编译失败的 Blade 错误会显示具体行号;关闭后只会抛出模糊的InvalidArgumentException - 运行
php artisan view:clear才能刷新已编译的storage/framework/views/*.php,否则改了父模板也不生效
@extends 和 @section 的匹配逻辑很严格
子模板里写 @extends('layouts.app'),Laravel 就去 resources/views/layouts/app.blade.php 找;如果该文件里没定义 @yield('content'),或者子模板用了 @section('main') 但父模板没对应 @yield('main'),渲染时就静默忽略那段内容——不报错,也不输出,容易误以为“没加载成功”。
- 父模板中
@yield('title', '默认标题')的第二个参数是 fallback,不是默认值赋给变量 -
@section('content')...@endsection和@section('content')...@show区别很大:@show会立即输出并结束 section,@endsection只注册内容,等@yield调用时才输出 - 嵌套
@section不合法,比如在@section('content')里再写一个@section('sidebar'),Laravel 不会报错但行为不可预测
自定义指令或共享数据要通过 View::share 或 Service Provider 注入
很多人想在布局里直接用 $user->name,但没意识到:Laravel 的视图数据是局部作用域的。控制器里传的 compact('posts') 不会自动流向 layouts/app.blade.php,除非显式共享。
立即学习“PHP免费学习笔记(深入)”;
- 在
AppServiceProvider::boot()里调用View::share('site_name', config('app.name')),所有视图都能访问$site_name -
@auth和@guest是 Laravel 提供的指令,底层依赖Auth::check(),如果你关了AuthServiceProvider或没配好 guard,它们永远返回 false - 用
view()->composer('layouts.app', function ($view) { ... })可以给布局注入动态数据,但注意不要在这里做耗时查询,它会在每次渲染布局时执行
Blade 继承真正的难点不在语法,而在理解它是 Laravel 视图生命周期的一部分:从路由解析、中间件执行、控制器返回响应、到 ViewFactory 实例化、BladeCompiler 编译、缓存写入、最终 PHP 执行——漏掉任意一环,@extends 就只是字符串。



















