AppServiceProvider,在控制器中设置了语言环境

时间:2016-11-12 00:31:28

标签: laravel

情况如下:

  • 我正在使用Laravel 5.3
  • 在我的Text模型上,我有以下两列:slug_frslug_en
  • 我的路由器调用textController,我在其上设置了区域设置(fren),具体取决于找到的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;

有没有更简洁的方法呢?我的逻辑是否完全有缺陷?我对所有建议持开放态度。

1 个答案:

答案 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.*')