Laravel5.5: сохраняйте данные провайдера во время сеанса, чтобы избежать перегрузки - PullRequest
1 голос
/ 11 марта 2019

Я сделал 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 Ответ

2 голосов
/ 11 марта 2019

Вы можете просто кэшировать переменную и использовать ее в обратном вызове, например:

$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 и ниже - в МИНУТАХ.

Поскольку ваш поставщик услуг загружается только один раз за запрос / жизненный цикл, это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...