Danish
Danish

Reputation: 353

Best way share data across all view in Laravel

I have some data that I want to share across all views. I am using AppServiceProvider's boot method to share data.it is working fine with MySQL however with pgsql when I run composer or PHP artisan commands I am getting the following error,(i do fresh and seed database very often)

SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "news" does not exist

it took me a while to understand where is the real issue. I m still unable to understand if it is pgsql related error or something else, bellow is code in AppServiceProvider. if I comment this code everything works fine except where I m using this.

public function boot()
{
    $activeClubs = (new TournamentService())->getAllActiveClubs();
    $activeNews = (new TournamentService())->getActiveNews();
    $activeTournaments = (new TournamentService())->getActiveTournament();
    View::share(['activeClubs' => $activeClubs, 'activeTournaments' => $activeTournaments, 'activeNews' => $activeNews]);
}

can you please help me that how can i share data across all views that i don't get this error in future.

Upvotes: 0

Views: 560

Answers (1)

Hamidreza
Hamidreza

Reputation: 724

you can determine if the app is running from console or not and prevent loading data in console

if ( !app()->runningInConsole() ){
    // it's not console.
}

you mentioned you want to load this data in all views but sometimes, its one view that loaded in all of your views e.g. the layout.app view.

if its the case I recommend using view composers instead of View::share() as it will pass the data to that view before render and it will only run if that view is included in the page (so basically it will solve your problem even without app()->runningInConsole() condition required )

view composers doc

simple example:

View::composer('view-name', function ($view) {
             $view->with('key', 'value');
        });

Upvotes: 1

Related Questions