Leverage Potential of Laravel ViewComposer to share data across views

In Laravel, there is a core functionality to reuse the frequently used data throughout your laravel application. So, in this post, we’ll learn how you can leverage the Laravel ViewComposer method to share data across the views.

I’ll take an example of company information such as an address, contact number and email, etc which are used frequently and displayed on all the page of the website. So I have created a model CompanyInformationModel to store company information.
app\Models\CompanyInformationModel.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class CompanyInformationModel extends Model
{

    protected $table = 'company_information'; 
    protected $primaryKey = 'id'; 
    protected $fillable = ['company_name', 'customer_care_no', 'customer_care_email', 'company_address' ];
    
}    

Then for the composer, we’ll create a simple class with the name CompanyInfoComposer which contains two methods and they are __construct() and compose( View $view ) method.
app\Http\ViewComposers\CompanyInfoComposer.php

<?php
namespace App\Http\ViewComposers;

use App\Models\CompanyInformationModel;
use Illuminate\View\View;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CompanyInfoComposer {

    protected $company_info = [];

    public function __construct( ) {

    }

    public function getCompanyInfo( ) {
        $this->company_info = CompanyInformationModel::first();
    }

    // this method binds data to view
    public function compose(View $view) {
        $this->getCompanyInfo(); 

        $view->with('company_info_composer', $this->company_info );

    }

}

In composer class CompanyInfoComposer the property $company_info contains a model instance of CompanyInformationModel and the method getCompanyInfo( ) will assign the CompanyInformationModel object to $company_info property.

The method compose(View $view) binds the data to view called and it is called implicitly by the View::composer() method. When using this in template or view called company_info_composer as a variable and you’ll get the CompanyInformationModel model instance.

Setting up the ViewServiceProvide

Asper Laravel documentation to use View::composer() the method must be included within the boot() method of the service provider.
To create a service provider for views at location app\Providers\ViewServiceProvider.php.

<?php

namespace App\Providers;

use App\Http\ViewComposers\CompanyInfoComposer;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\View;

class ViewServiceProvider extends ServiceProvider
{
    
    public function boot()
    {
        View::composer(
            '*', CompanyInfoComposer::class
        );
        
    }
}

Register ViewServiceProvide in app.php

Whenever you create a service provider you have to register it into config\app.php within an array providers.

'providers' => [
    '...',
    '...',
    App\Providers\ViewServiceProvider::class
]

Creating Controllers

I have created a ViewComposerController in app\Http\Controllers\ViewComposerController.php with two methods home( Request $request ) and contact( Request $request ).

<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;

class ViewComposerController extends Controller{

    public function home( Request $request ){
        return view( 'view-composer.home', [] );
    }

    public function contact( Request $request ){
        return view( 'view-composer.about', [] );
    }
}

Create Views to display company information

So we have two views i.e view-composer.home and view-composer.about and these views are under folder resources\views\view-composer.

home.blade.php

<p>Company Name: {{ $company_info_composer->company_name }}</p>
<p>Customer Care Number: {{ $company_info_composer->customer_care_no }}</p>
<p>Customer Care Email: {{ $company_info_composer->customer_care_email }}</p>
<p>Address: {{ $company_info_composer->company_address }}</p>

contact.blade.php

<p>Company Name: {{ $company_info_composer->company_name }}</p>
<p>Customer Care Number: {{ $company_info_composer->customer_care_no }}</p>
<p>Customer Care Email: {{ $company_info_composer->customer_care_email }}</p>
<p>Address: {{ $company_info_composer->company_address }}</p>

Setup Web Routes

In routes\web.php

use App\Http\Controllers\ViewComposerController;

Route::get( 'view-composer/home',  [ ViewComposerController::class, 'home' ] )->name('view-composer.home');
Route::get( 'view-composer/contact',  [ ViewComposerController::class, 'contact' ] )->name('view-composer.contact');

Output

Share data throughout application using Laravel View::composer method.
Share data throughout the application using Laravel View::composer method.

Video

Extra Tips: Pass data to a specific view

View::composer(
    ['home'],
    CompanyInfoComposer::class
);

In this case, the company_info_composer can only be accessible in view view-composer/home.blade.php.

Closure function within View::composer() method

If you don’t want to pass a class then insisted that you can use a closure function and returns the data you want.

View::composer('*', function ($view) {
    // return your data here
});

Conclusion

So we have reached the end of this post on Leverage Potential of Laravel ViewComposer to share data across views. If you like then share this post.

Related Posts

Summary
Review Date
Reviewed Item
Leverage Potential of Laravel ViewComposer to share data across views
Author Rating
51star1star1star1star1star
Software Name
Laravel Framework
Software Name
Windows Os, Mac Os, Ubuntu Os
Software Category
Web Development