我需要全局设置变量,但它应该是动态的,意味着我可以(在某个仪表板页面/视图上)设置此变量。
我发现,我可以通过ServiceProvider为某些或所有视图设置全局变量,但是如何设置呢?把它放到会话中会更好吗?
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// Using view composer for specific view
view()->composer('*',function($view) {
$view->with('var_id', ?????????);
});
}
}
应该有一个链接说明(例如)localhost / setVar1 / {id}(setVar1是一个examplename)。它应该在用户注销之前有效(这里不是问题)。
有什么想法吗?
答案 0 :(得分:2)
您还可以在中间件中使用View::share
。因此,您在routes/web.php
中定义路由将使用中间件。
例如:我的'/user/'
需要变量'user','/user/'
内的所有路由都需要相同的变量,所以我这样做:
在中间件文件中,我定义View::share('user', $user)
,并在routes/web.php
中定义:
Route::group(['middleware' => 'MyMiddlewareName'], function() {
// All the routes
});
或者放入需要该中间件的所有路由,只需将->middleware('MyMiddlewareName');
放在路由中,就像这样
Route::get('user', function () {
//
})->middleware('MyMiddlewareName');
不要忘记在Kernel.php中设置中间件,如下所示:
'MyMiddlewareName' => \App\Http\Middleware\MyMiddlewareName::class
在中间件中,您可以验证用户是否在您需要的URL中。
答案 1 :(得分:1)
这就是我目前所做的,我使用观察者和缓存...我不知道这是最好的方式,它只是一个建议
Configuration
是我的样本模型,当我有更新或创建新数据时我加载所有配置,我用观察者听
ConfigObserver充当任何配置更改的侦听器并更新缓存
class ConfigObserver
{
public function created(Configuration $setting)
{
$this->updateConfig();
}
public function deleted(Configuration $setting)
{
//
}
public function updated(Configuration $setting)
{
$this->updateConfig();
}
private function updateConfig()
{
//store in cache
Cache::forever('configuration', Configuration::pluck('value', 'key')->toArray());
}
}
在引导方法的AppServiceProvider中,将观察者设置为配置模型
Configuration::observe(new ConfigObserver());
然后,view()
或AppServiceProvider
Middleware
方法
view()->composer('*', function ($view) {
//check if cache is not available, just query it back and store, then pass to view
$config = Cache::get('configuration', function () {
return Cache::forever('configuration', Configuration::pluck('value', 'key')->toArray());
});
$view->with('config', $config);
});