Вы можете просто кэшировать переменную и использовать ее в обратном вызове, например:
$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 и ниже - в МИНУТАХ.
Поскольку ваш поставщик услуг загружается только один раз за запрос / жизненный цикл, это должно сработать.