Laravel5.5:在会话中保存提供者数据以避免过载

时间:2019-03-11 11:40:49

标签: laravel memory-efficient

我已经创建了一个ServiceProvider以便在多个视图上加载数据。像这样:

View::composer(['components.navigation.main.search','search.*','page-parts.cats','page-parts.categories_menu','page-parts.categories_more','page-parts.cats_top','components.modals.off-category'],function ($view) {
            $view->with([
                'toplevel_categories' => Category::topLevel()->orderBy('name')->get(),
            ]);
        });

但是在几个html页面上,他需要加载多个这些视图,并且我不想每次都加载topLevel类别,以避免过载和更少的运行时间。

我可以在会话中存储加载的数据(toplevel_categories),还是处理此问题的最有效方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以简单地缓存变量并在回调中使用它,如:

$topLevelCategories = Category::topLevel()->orderBy('name')->get();

View::composer([], function($view) use ($topLevelCategories) {
    $view->with([
        'toplevel_categories' => $topLevelCategories
}

您甚至可以使用laravel本身的缓存机制来保存其他查询,例如将其缓存30分钟(假设数据库在此期间没有更改):

// Save the categories in the cache or retrieve them from it.
$topLevelCategories = Cache::remember('topLevelCategories', 30, function() {
    return Category::topLevel()->orderBy('name')->get();
});

请注意,对于Laravel 5.8,第二个参数位于SECONDS中,对于5.7及以下版本,其第二个参数位于MINUTES中。

由于每个请求/生命周期仅向您的服务提供商加载一次,因此应该可以解决问题。