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 AppProviders; use IlluminateSupportFacadesView;
use IlluminateSupportServiceProvider; 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:
- Create a new View Composer by running the following command in your terminal:
php artisan make:provider ViewServiceProvider
- Open the newly created file
app/Providers/ViewServiceProvider.php
and include the following code:
namespace AppProviders; use IlluminateSupportFacadesView;
use IlluminateSupportServiceProvider; 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 AppHttpControllers; 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 AppHttpControllers; 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', [AppHttpControllersHomeController::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 AppHttpMiddleware; use Closure;
use IlluminateSupportFacadesView; 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.