我已经创建了一个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),还是处理此问题的最有效方法是什么?
答案 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中。
由于每个请求/生命周期仅向您的服务提供商加载一次,因此应该可以解决问题。