情况如下:
Text
模型上,我有以下两列:slug_fr
和slug_en
textController
,我在其上设置了区域设置(fr
或en
),具体取决于找到的slug(使用App::setLocale()
)。Text
模型上,我有这个方法getSlugAttribute
,它根据语言环境返回slug,如果出错则默认为英语。一切都很完美,但我需要在所有页面上创建一个菜单。我更新了AppServiceProvider:boot()
方法以在所有视图中共享菜单(如in Laravel's documentation所述),为每个页面创建一个简单数组(我在这里每个页面都调用了$text->slug
) 。该阵列如下:
$menu[] = [
'title' => $text->title, // (I also have a getTitleAttribute working the same way)
'slug' => $text->slug,
];
正如我很快发现的那样,AppServiceProvider在路由器和我的控制器之前执行,我的语言环境尚未设置,导致我的所有菜单项都是英文(我的方法的后备)。
我更新了serviceProvider以返回一个文本对象数组,因此在视图中调用getSlugAttribute(因此在设置了语言环境之后),但我发现它不是很整洁。
$menu[] = $text;
有没有更简洁的方法呢?我的逻辑是否完全有缺陷?我对所有建议持开放态度。
答案 0 :(得分:1)
我建议你使用view()->composer('*')
。那里的变量将与您的所有视图共享。我用它来做我的导航栏。
类似的东西:
//Route file
view()->composer('*', function ($view) {
//Whatever logic you need to get to your $menu
return $view->with('menu', $menu)
});
您还可以定义子组view()->composer('foo.*')
。