Laravel - Difference between @yield and @section?
This line clears out the confusion: "Note that views which extend a Blade layout simply override sections from the layout. Content of the layout can be included in a child view using the @parent
directive in a section".
So, if you already have a @section
defined in the master layout, it will be overriden unless you specify @parent
inside the child layout's @section
.
But for @yield
, it always gets the section from the child layout. That means it always overrides the @yield
part, even if it has a default defined as @yield('section', 'Default Content')
.
I hope that clears your confusion. Let me know if you have more questions. Thanks
Short Answer: Always use @yield
unless you want to do something more complicated then providing a default string
.
Long Answer: Both @yield and @section .. @show are used to be optionally overwritten whenever you extend the blade template. Everything you can do with @yield can also be done with @section .. @show but not the other way around. Here is what they do:
@yield('main')
- Can be replaced by @section('main') .. @endsection
- Can be provided with a default string but no HTML! The default string will be shown in the sub-blade-template when no @section('main') .. @endsection is provided.
@section('main') .. @show
- Can be replaced by @section('main') .. @endsection
- Can be provided with a default HTML code. The default HTML code will be shown in the sub-blade-template when no @section('main') is provided.
- Can be replaced by @section('main')@parent .. @endsection and additionally shows the default HTML code.
Here some examples:test.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<h1>This is a test</h1>
@yield('mainA')
@yield('mainB', 'This is the alternative 1')
@yield('mainC', '<p>This is the alternative 2</p>')
@yield('mainD', 'This is the alternative 3')
@section('testA')
@show
@section('testB')
This is the alternative 4
@show
@section('testC')
<p>This is the alternative 5</p>
@show
@section('testD')
<p>This is the alternative 6</p>
@show
</body>
</html>
here is another file called testA.blade.php
which extends the other bladed file:
@extends('test')
@section('mainD')
<div>
<p>First replacement!</p>
<hr>
</div>
@endsection
@section('testC')
<div>
<p>Second replacement!</p>
<hr>
</div>
@endsection
@section('testD')
@parent
<div>
<p>Additional content</p>
<hr>
</div>
@endsection
And that is the outcome: