Search code examples
templateslaravelviewlaravel-5laravel-blade

Laravel 5 - global Blade view variable available in all templates


How can I in Laravel 5 make global variable which will be available in all Blade templates?


Solution

  • Option 1:

    You can use view::share() like so:

    <?php namespace App\Http\Controllers;
    
    use View;
    
    //You can create a BaseController:
    
    class BaseController extends Controller {
    
        public $variable1 = "I am Data";
    
        public function __construct() {
    
           $variable2 = "I am Data 2";
           
    
           View::share ( 'variable1', $this->variable1 );
           View::share ( 'variable2', $variable2 );
           View::share ( 'variable3', 'I am Data 3' );
           View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
        }  
    
    }
    
    class HomeController extends BaseController {
    
        //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:
    
        public function __construct(){
           parent::__construct();
        }
    
        public function Index(){
          //All variable will be available in views
          return view('home');
        }
    
    }
    

    Option 2: Use a composer:

    1. Create a composer file at app\Composers\HomeComposer.php

    NB: create app\Composers if it does not exists

    <?php namespace App\Composers;
    
    class HomeComposer
    {
        
        public function compose($view)
        {
            //Add your variables
            $view->with('variable1',      'I am Data')
                 ->with('variable2',      'I am Data 2');
        }
    }
    

    Then you can attach the composer to any view by doing this

    <?php namespace App\Http\Controllers;
    
    use View;
    
    class HomeController extends Controller{
    
    
        public function __construct(){
      
            View::composers([
                'App\Composers\HomeComposer'  => ['home'] //attaches HomeComposer to home.blade.php
            ]);
    
        }
    
        public function Index(){
            return view('home');
        }
    
    }
    

    Option 3: Add Composer to a Service Provider, In Laravel 5 I prefer having my composer in App\Providers\ViewServiceProvider

    1. Create a composer file at app\Composers\HomeComposer.php

    2. Add HomeComposer to App\Providers\ViewServiceProvider

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use View;
    use App\Composers\HomeComposer;
    use Illuminate\Support\Facades\Blade;
    
    class ViewServiceProvider extends ServiceProvider
    {
        /**
         * Register any application services.
     *
         * @return void
         */
        public function register()
        {
            //
        }
    
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            //add to all views
            view()->composer('*', HomeComposer::class);
            //add to only home view 
            //view()->composer('home', HomeComposer::class);
        }
    }