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

问题描述 投票:1回答:1

我已经创建了一个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类别以避免重载和运行时间更少。

我可以将加载的数据(顶级类别)存储在会话中,或者处理此问题的最有效方法是什么?

laravel memory-efficient
1个回答
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中。

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

© www.soinside.com 2019 - 2024. All rights reserved.