By Kamrul Islam Tushar
Date: January 30, 2020
View Composers are callback or a class method that gets executed when a view is rendered. That means when Laravel loads a *.blade.php file to serve to the browser to display contents it executes View Composers.
Suppose we have some data, we will be needing on multiple views or on any layout file that gets loaded into multiple views. Writing the logic or executing a query inside the blade is bad practice. Or passing the data from multiple controller functions is not a good idea either. That’s exactly when view composers comes into play. Let me give you some example and procedure on how to use view composers to bind data to multiple views using a single logic location.
Suppose we have an e-commerce application that has many categories stored in DB. And we will need the categories list in every view that is being rendered.
We can send the categories to home page like this
public function index() { $categories = Category::all(); return view('welcome', compact('categories')); }
If we need the category list on /home page, we’ll have to do the same query for the same listing in different function. Now imagine what if we need the data on many pages. Doing that same query over and over again makes it hard to maintain code base. But using View Composers, we can pass the data to multiple view files from one logic block. Let me show you how we can do that.
First lets create a ViewComposer Service provider by running command php artisan make:provider ComposerServiceProvider
The newly created ComposerServiceProvider will look like this.
Now let’s add the ComposerServiceProvider class to config/app.php providers array so that Laravel can recognise it.
On the next step lets create a View Composer CategoryComposer class inside App\Http\ViewComposers
folder.
Modify the boot
method in the new Provider by adding a composer
method that extends view()
.
public function boot()
{
view()->composer(
'app',
'App\Http\ViewComposers\CategoryComposer'
);
}
Laravel will execute a CategoryComposer@compose
method every time app.blade.php
is rendered. This means that every time the view is loaded , we will be ready to show the categories in home.blade.php & welcome.blade.php with the categories list from our view composer.
Next, we’ll pass the categories list from our view composer to our views from the compose method.
public function compose(View $view) { $categories = Category::all(); $view->with(['categories' => $categories]); }
Now we can access the categories array on both view files without needing to send data from multiple controller functions.
** Controller ** public function index() { return view('home'); } public function welcome() { return view('welcome'); }
Accessing the categories array on welcome.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Dashboard</div> <div class="card-body"> <ul class="list-group"> @foreach($categories as $category) <li class="list-group-item">{{$category>title }}</li> @endforeach </ul> </div> </div> </div> </div> </div> @endsection
Note: It is possible to create a view composer that is executed when all views are rendered by replacing the view name with an asterisk wildcard
view()->composer('*', function (View $view) {
//Logic block
});
That’s all for today. See you one the next one.
Want to receive a fortnightly round up of the latest tech updates? Subscribe to
our free newsletter. No spam, just insightful content covering design,
development, AI and much more.