Laravel新手咨询:如何用@yield引入journal目录下的局部视图
解答:Laravel中用@yield替代@include引入局部视图的可行方案
嘿,作为Laravel新手碰到布局相关的疑问太正常了,我来给你理清楚@yield和@include的核心区别,以及怎么实现你想要的需求~
首先明确:@yield本身不能直接引入局部视图,它的作用是在父视图中定义「占位槽」,需要子视图用@section填充内容;而@include是直接插入并渲染指定的局部视图。不过你想要用@yield的思路来管理这两个局部视图是完全可行的,只是需要结合@section来实现,下面给你两种适配不同需求的方案:
方案一:支持后续覆盖的动态占位(推荐)
如果你希望这两个局部视图的内容未来可以被其他继承detailsjournal.blade.php的视图替换,那可以给@yield设置默认内容,默认内容就是引入你的局部视图。
步骤1:修改journal/detailsjournal.blade.php
把它变成一个中间布局,继承默认布局的同时,定义带默认内容的yield占位:
@extends('layouts.default') @section('content') <div class="journal-container"> {{-- 左侧区域:默认加载leftSection,允许后续被覆盖 --}} @yield('left-section', view('journal.partials.leftSection')) {{-- 右侧区域:默认加载rightSection,允许后续被覆盖 --}} @yield('right-section', view('journal.partials.rightSection')) </div> @endsection
效果说明
- 当你直接访问
detailsjournal视图时,@yield会自动渲染默认的leftSection和rightSection局部视图,效果和@include完全一致。 - 如果之后你需要创建一个自定义的视图(比如
journal/customDetails.blade.php),想要替换左侧区域的内容,只需要继承detailsjournal并覆盖对应的section即可:
@extends('journal.detailsjournal') @section('left-section') {{-- 这里写你自定义的左侧内容,会替换原来的leftSection --}} <div class="custom-left-panel"> <h3>自定义左侧标题</h3> <p>自定义内容...</p> </div> @endsection
方案二:单纯用@yield包裹局部视图(无覆盖需求)
如果你只是想换一种写法,不需要后续覆盖内容,那可以先在detailsjournal中用@section包裹局部视图,再用@yield输出:
@extends('layouts.default') {{-- 先定义左侧区域的section,内容为引入局部视图 --}} @section('left-section') @include('journal.partials.leftSection') @endsection {{-- 定义右侧区域的section --}} @section('right-section') @include('journal.partials.rightSection') @endsection @section('content') <div class="journal-container"> {{-- 用@yield输出两个section的内容 --}} @yield('left-section') @yield('right-section') </div> @endsection
这种写法和直接用@include效果完全一样,只是多了一层section的包裹,适合你单纯想体验@yield用法的场景。
核心总结
@yield的本质是「占位+渲染section内容」,不能直接加载视图,必须配合@section使用。- 如果需要动态替换内容,方案一是最优解;如果只是换写法,方案二也可以,但其实
@include更直接高效。
内容的提问来源于stack exchange,提问作者Chandra Shekhar
相关产品推荐
相关产品推荐

