From the Laravel docs, you can include \'sections\' inside layouts using two methods:
@section(\'sidebar\')
Thi
The shortest answer:
Use @yield
in master if you want to overwrite child data on master layout completely.
Use @section
in master if you want to use master and child data together on child with @parent
(Or overwrite child data on master layout like @yield
)
Basically yield('content')
is a marker. For example, in the tag if you put a yield('content')
, your saying this section has the name of content and by the way, you can name inside of the parenthesis anything you want. it doesn't have to be content. it can be yield('inside'). or anything you want.
And then in the child page where you want to import html from your layout page, you just say section('name of the section')
.
for example, if you have marked your header in your layout page as yield('my_head_band')
<-- or anything else you want, then in your child page you just say @section('my_head_band')
.
This would import the header from the layout page into your child page. vice versa with your body section which in this case was named as content.
Hope this helps.
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
Just to add on something small, @yield
basically defines a section to be injected by overwriting
the data and it also works if our view @extends
the parent view.
Now when we overwrite
, we replace an implementation completely with a new implementation, like a company can decide to change/overwrite its entire technology if they realize something went wrong.
It should not be confused with override
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')
@section('main') .. @show
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: