首页 > 解决方案 > Laravel5.5:在 session 中保存 Provider 数据,避免过载

问题描述

我制作了一个 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)存储在会话中吗?或者处理这个问题的最有效方法是什么?

标签: laravelmemory-efficient

解决方案


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

$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 为单位。

由于您的服务提供者每个请求/生命周期只加载一次,这应该可以解决问题。


推荐阅读