Laravel Blade - Chain/Embed multiple layouts
I'm not sure I get what you're after here. For instance in home.blade.php
you extend "nav", which in turn extends "master", but both "master" and "nav" yield content
, so the <home>
content will render twice.
So, what is your expected output? I'm not sure "home" or "about" should really extend
"nav" or "breadcrumb". I think of these two as sort of structural layout components, so it does make sense to me to include
them in the master layout. In "nav" you can define a section to extend when your view needs a breadcrumb.
For instance:
master.blade.php
<html><head><!-- stuff --></head> <body> @include('nav') @yield('content') </body></html>
nav.blade.php
<nav> <!-- nav content --> @yield('breadcrumb')</nav>
home.blade.php
@extend('master')@section('content') <home> <!-- content --> </home>@endsection
about.blade.php
@extend('master')@section('breadcrumb') <breadcrumb> <!-- breadcrumb content --> </breadcrumb>@endsection@section('content') <about> <!-- content --> </about>@endsection
You forgot using @parent
. Here's the example:
master.blade.php
<html> <head> {{-- Stuff --}} </head> <body> @yield('content') </body></html>
nav.blade.php
You need to put the nav
inside section
to tell master
layout that this is a content. If you don't, nav
will be in the top of master
layout (yes, outside html).
@extends('master')@section('content') <nav> <p>nav content</p> </nav>@endsection
home.blade.php
In this example, the content
section is utilizing the @parent
directive to append (rather than overwriting) content to the layout's sidebar. The @parent
directive will be replaced by the content of the layout when the view is rendered.
@extends('nav')@section('content') {{-- You can control where @parent should be rendered --}} @parent <home> <p>home content</p> </home> {{-- You can put your @parent here, give it a try --}}@endsection
breadcrumb.blade.php
@extends('nav')@section('content') {{-- You can control where @parent should be rendered --}} @parent <breadcrumb> <p>breadcrumb content</p> </breadcrumb> {{-- You can put your @parent here, give it a try --}}@endsection
about.blade.php
@extends('breadcrumb')@section('content') {{-- You can control where @parent should be rendered --}} @parent <about> <p>about content</p> </about> {{-- You can put your @parent here, give it a try --}}@endsection
Rendered:
home.blade.php
<html><head></head><body> <nav> <p>nav content</p> </nav> <home> <p>home content</p> </home></body></html>
about.blade.php
<html><head></head><body> <nav> <p>nav content</p> </nav> <breadcrumb> <p>breadcrumb content</p> </breadcrumb> <about> <p>about content</p> </about></body></html>