Laravel5.5:将Provider数据保存在session中,避免过载
Laravel5.5: save Provider data in session to avoid overload
我制作了一个 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_categories) 存储在会话中吗?或者处理此问题的最有效方法是什么?
您可以简单地缓存变量并在回调中使用它,例如:
$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 第二个参数以秒为单位,5.7 及以下版本以分钟为单位。
由于您的服务提供者每次 request/lifecycle 只加载一次,这应该可以解决问题。
我制作了一个 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_categories) 存储在会话中吗?或者处理此问题的最有效方法是什么?
您可以简单地缓存变量并在回调中使用它,例如:
$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 第二个参数以秒为单位,5.7 及以下版本以分钟为单位。
由于您的服务提供者每次 request/lifecycle 只加载一次,这应该可以解决问题。