How to share a variable across all views?

前端 未结 2 2039
自闭症患者
自闭症患者 2020-12-06 17:40

I want information about the system locale to be available in every view, so I could highlight whatever language is currently selected by a user. After some googling around,

2条回答
  •  情歌与酒
    2020-12-06 17:56

    I usually use View Composers so it's more clear and readable.

    For example If I want to share a variable with the main navbar to all of my views I follow the below rules:

    1. Create new service provider

    You can create a service provider with artisan cli:

    php artisan make:provider ViewComposerServiceProvider

    In the ViewComposerServiceProvider file create composeNavigation method in which has the blade template main.nav-menu that represents the navmenu with shared variables.

    The ViewComposerServiceProvider looks like:

    composeNavigation();
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    
        private function composeNavigation()
        {
            view()->composer('main.nav-menu', 'App\Http\ViewComposers\NavComposer');
        }
    }
    

    2. Create Composer

    As you saw in the file above we have App\Http\ViewComposers\NavComposer.php so let's create that file. Create the folder ViewComposers in the App\Http and then inside create NavComposer.php file.

    The NavComposer.php file:

    menu = $menu;
        }
    
        public function compose(View $view)
        {
            $thing= $this->menu->thing();
            $somethingElse = $this->menu->somethingElseForMyDatabase();
    
            $view->with(compact('thing', 'somethingElse'));
        }
    }
    

    3. Create repository

    As you saw above in the NavComposer.php file we have repository. Usually, I create a repository in the App directory, so create Repositories directory in the App and then, create inside NavMenuRepository.php file.

    This file is the heart of that design pattern. In that file we have to take the value of our variables that we want to share with all of our views.

    Take a look at the file bellow:

    firstOrFail();
            return $getVarForShareWithAllViews;
        }
    
        public function somethingElseForMyDatabase()
        {
            $getSomethingToMyViews = DB::table('table')->select('name', 'something')->get();
    
            return $getSomethingToMyViews;
        }
    
    }
    

提交回复
热议问题