Your application probably uses a common layout across most of its pages. Manually creating this layout within every controller action can be a pain. Specifying a controller layout will make your development much more enjoyable. Here's how to get started:
class Base_Controller extends Controller {
public $layout = 'layouts.common';
}
public function action_profile()
{
$this->layout->nest('content', 'user.profile');
}
Note: When using layouts, actions do not need to return anything.
View sections provide a simple way to inject content into layouts from nested views. For example, perhaps you want to inject a nested view's needed JavaScript into the header of your layout. Let's dig in:
<?php Section::start('scripts'); ?>
<script src="jquery.js"></script>
<?php Section::stop(); ?>
<head>
<?php echo Section::yield('scripts'); ?>
</head>
@section('scripts')
<script src="jquery.js"></script>
@endsection
<head>
@yield('scripts')
</head>
Blade makes writing your views pure bliss. To create a blade view, simply name your view file with a ".blade.php" extension. Blade allows you to use beautiful, unobtrusive syntax for writing PHP control structures and echoing data. Here's an example:
Hello, {{$name}}.
{{ Asset::styles() }}
You can use @include to render a view into another view. The rendered view will automatically inherit all of the data from the current view.
<h1>Profile</hi>
@include('user.profile')
Similarly, you can use @render, which behaves the same as @include except the rendered view will not inherit the data from the current view.
@render('admin.list')
<h1>Comments</h1>
@foreach ($comments as $comment)
The comment body is {{$comment->body}}.
@endforeach
@if (count($comments) > 0)
I have comments!
@else
I have no comments!
@endif
@for ($i =0; $i < count($comments) - 1; $i++)
The comment body is {{$comments[$i]}}
@endfor
@while ($something)
I am still looping!
@endwhile
@forelse ($posts as $post)
{{ $post->body }}
@empty
There are not posts in the array!
@endforelse
@unless(Auth::check())
{{ HTML::link_to_route('login', 'Login'); }}
@endunless
// Equivalent...
<?php if ( ! Auth::check()): ?>
...
<?php endif; ?>
@if ($check)
{{-- This is a comment --}}
...
@endif
{{--
This is
a multi-line
comment.
--}}
Note: Blade comments, unlike HTML comments, are not visible in the HTML source.
Not only does Blade provide clean, elegant syntax for common PHP control structures, it also gives you a beautiful method of using layouts for your views. For example, perhaps your application uses a "master" view to provide a common look and feel for your application. It may look something like this:
<html>
<ul class="navigation">
@section('navigation')
<li>Nav Item 1</li>
<li>Nav Item 2</li>
@yield_section
</ul>
<div class="content">
@yield('content')
</div>
</html>
Notice the "content" section being yielded. We need to fill this section with some text, so let's make another view that uses this layout:
@layout('master')
@section('content')
Welcome to the profile page!
@endsection
Great! Now, we can simply return the "profile" view from our route:
return View::make('profile');
The profile view will automatically use the "master" template thanks to Blade's @layout expression.
Important: The @layout call must always be on the very first line of the file, with no leading whitespaces or newline breaks.
Sometimes you may want to only append to a section of a layout rather than overwrite it. For example, consider the navigation list in our "master" layout. Let's assume we just want to append a new list item. Here's how to do it:
@layout('master')
@section('navigation')
@parent
<li>Nav Item 3</li>
@endsection
@section('content')
Welcome to the profile page!
@endsection
Notice the @parent Blade construct? It will be replaced with the contents of the layout's navigation section, providing you with a beautiful and powerful method of performing layout extension and inheritance.