4 Techniques for Sharing Data Across All Views in Laravel

5 min read
03 November 2023

In this article, we will explore four methods to efficiently share common variables or data across all views in Laravel, eliminating the need to manually pass them to each view. This becomes particularly useful when you have data like navigation menu items or global variables that you want to access in multiple views.

To achieve this, you can employ the following approaches:

Method 1: Utilizing AppServiceProvider

In your Laravel project, navigate to app/Providers/AppServiceProvider.php and insert the following code snippet:

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        View::share('myGlobalKey', 'This is our value');
    }
}

Replace 'myGlobalKey' with your desired key name and 'This is our value' with the actual value or data you intend to share. Create a test.blade.php file and include the following code:

Test: {{ $myGlobalKey }}

To see the result, add a test route in web.php:

Route::get('/test', function () {
    return view('test');
});

Upon opening the browser, you will observe the shared value displayed on the page.

Method 2: Employing a View Composer

View Composers offer a more flexible approach for passing data to views. Here's how to use them:

  1. Create a new View Composer by running the following command in your terminal:
php artisan make:provider ViewServiceProvider
  1. Open the newly created file app/Providers/ViewServiceProvider.php and include the following code:
namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        View::composer('*', function ($view) {
            $view->with('viewComposerBasedValue', 'This is our value as shared by a view composer');
        });
    }
}

Replace 'key' with your preferred key name and 'value' with the data you want to share. In config/app.php, add your custom ViewServiceProvider.

Method 3: Utilizing a BaseController

Another approach to sharing data across views is by creating a BaseController and setting shared values in its constructor. This way, every controller that extends the BaseController will have access to this data in all its views.

Follow these steps:

1. Generate a BaseController by running the following command in your terminal:

php artisan make:controller BaseController

2. In the BaseController, define a method that will be called for all requests:

namespace App\Http\Controllers;

class BaseController extends Controller
{
    public function __construct()
    {
        view()->share('anotherGlobalValue', 'This is another one of our values');
    }
}

3. Create another controller, for instance, HomeController:

php artisan make:controller HomeController

4. Open the HomeController.php file and extend the BaseController:

namespace App\Http\Controllers;

class HomeController extends BaseController
{
    public function home() {
        return view('home');
    }
}

5. In your views folder, create a home.blade.php and add:

Test Home: {{ $anotherGlobalValue }}

6. Add a test route to web.php:

Route::get('/home', [\App\Http\Controllers\HomeController::class, 'home']);

Upon opening the browser, you will see the result.

Note that when using the BaseController method, you need to extend all controllers that require the shared data to ensure they inherit the data defined in the BaseController.

Method 4: Employing Middleware

Middleware provides a convenient way to intercept requests and perform tasks before any controller or view code is executed. You can use this to set data before it's accessed by any of your views.

Follow these steps:

1. Create a new middleware by running the following command:

php artisan make:middleware SharedViewDataMiddleware

2. Open the newly created middleware file and add the following code:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\View;

class SharedViewDataMiddleware
{
    public function handle($request, Closure $next)
    {
        View::share('middlewareSharedData', 'This value was shared by our Middleware');

        return $next($request);
    }
}

3. Register the middleware in the $middleware property of your app/Http/Kernel.php file.

4. Add a view some-other-view.blade.php:

Here is the value shared from a middleware: {{ $middlewareSharedData }}

5. Open routes/web.php and add SharedViewDataMiddleware to a group, and inside the group, add all routes that need the shared data.

By implementing these methods, you can effortlessly access common data across your Blade views in Laravel.

In case you have found a mistake in the text, please send a message to the author by selecting the mistake and pressing Ctrl-Enter.
Den W. 3K
I'm a passionate tech enthusiast who loves diving into the world of software, programming, and tech reviews.
Comments (0)

    No comments yet

You must be logged in to comment.

Sign In / Sign Up