@content指令是Laravel框架中Blade模板引擎提供的一个内置指令,主要用于在模板中定义可以被子视图填充的内容区块,是实现模板布局复用和视图继承功能的核心指令之一。

@content指令的基本作用
@content指令的核心作用是标记一个内容区域,这个区域的内容可以在继承该模板的子视图中被替换或者补充。它通常和@extends指令配合使用,父模板中通过@content定义占位区域,子视图通过@section指令向对应的区域填充内容。
比如我们创建一个基础的布局模板,里面需要预留页面主体的位置,就可以使用@content来定义这个区域:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>@yield('title', '默认标题')</title>
</head>
<body>
<header>这是公共头部</header>
<main>
@content
</main>
<footer>这是公共底部</footer>
</body>
</html>
@content的使用场景
1. 基础布局复用
当多个页面拥有相同的头部、底部、侧边栏等公共结构时,我们可以把这些公共部分放在一个父模板中,用@content标记页面差异化的主体区域,子视图只需要继承父模板并填充主体内容即可,不需要重复编写公共结构。
子视图的使用方式如下:
<?php
// 继承基础布局模板
?>
@extends('layouts.base')
<?php
// 填充content区域的内容
?>
@section('content')
<h1>这是首页内容</h1>
<p>这里是首页的主体文本,会替换父模板中@content标记的区域</p>
@endsection
2. 多区域内容填充
如果父模板中有多个需要自定义的区域,我们可以给@content指令传递参数来定义不同的区域名称,子视图通过对应的区域名称来填充内容。比如父模板除了主体区域,还需要自定义侧边栏:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
</head>
<body>
<div class="sidebar">
@content('sidebar')
</div>
<div class="main">
@content('main')
</div>
</body>
</html>
子视图中对应填充不同区域的内容:
@extends('layouts.multi')
@section('sidebar')
<ul>
<li>菜单1</li>
<li>菜单2</li>
</ul>
@endsection
@section('main')
<h2>页面主体内容</h2>
<p>这里是页面的核心内容区域</p>
@endsection
@content和@yield的区别
很多开发者会混淆@content和@yield指令,两者的核心差异在于默认值的支持:
- @yield指令可以定义默认值,当子视图没有填充对应区域时,会显示默认值,语法为
@yield('区域名', '默认值')。 - @content指令本身不支持直接定义默认值,如果需要默认值,需要结合
@hasSection指令判断区域是否有内容,再决定显示默认值。
下面是@content配合默认值的使用示例:
@hasSection('content')
@content
@else
<p>当前区域暂无内容</p>
@endhasSection
使用注意事项
使用@content指令时需要注意,同一个区域名称在父模板中只能定义一次,否则子视图填充内容时会出现冲突。另外,@content标记的区域如果没有对应的@section填充,且未设置默认值,渲染时该区域会为空。
在Blade模板中,@content指令是布局复用的基础,熟练掌握它的用法可以有效减少重复代码,让模板结构更清晰,后续的维护成本也会更低。