Не могу понять, как выводить шаблон зекешированный отдельными элементами.
Во всех уроках из контроллера вызывается view сразу для всей страницы.
Для примера возьмём такой код:
public function show($id) {
$menu = Menu::getMenu(); // получаем объект состоящий из пунктов и подпунктов главного раскрывающегося меню
$sidebar = $this->getSidebar(); // получаем массив, объектов для боковой навигации - заголовки блоков и объекты для заполнения этих блоков (популярные статьи, новинки товаров, форма подписки и т.д.)
$page = Page::find($id); // объект содержащий метатеги, заголовки, картинки и прочий контент страницы
return view('page.show', compact('menu', 'sidebar', 'page'));
}
Я могу кешировать сразу всю страницу так:
public function show($id) {
$page_show = Cache::rememberForever('page'.$id, function() {
$menu = Menu::getMenu(); // получаем объект состоящий из пунктов и подпунктов главного раскрывающегося меню
$sidebar = $this->getSidebar(); // получаем массив, объектов для боковой навигации - заголовки блоков и объекты для заполнения этих блоков (популярные статьи, новинки товаров, форма подписки и т.д.)
$page = Page::find($id); // объект содержащий метатеги, заголовки, картинки и прочий контент страницы
return view('page.show', compact('menu', 'sidebar', 'page'))->render();
});
return $page_show;
}
Но у меня одинаковая менюшка для всех страниц, зачем генерировать её для каждой, если можно сразу для всех и потом брать уже из кеша.
Ещё данные страницы я хочу кешировать навечно, и обновлять вручную при обновлении страницы, а данные боковой навигации хочу кешировать на неделю, так как популярность статей меняется и новинки новые появляются.
Есть вариант кешировать сами объекты так:
public function show($id) {
$menu = Cache::rememberForever('menu', function() {
return Menu::getMenu(); // получаем объект состоящий из пунктов и подпунктов главного раскрывающегося меню
});
$sidebar = Cache::remember('sidebar', 10080, function() {
return $this->getSidebar(); // получаем массив, объектов для боковой навигации - заголовки блоков и объекты для заполнения этих блоков (популярные статьи, новинки товаров, форма подписки и т.д.)
});
$page = Cache::rememberForever('page'.$id, function() {
return Page::find($id); // объект содержащий метатеги, заголовки, картинки и прочий контент страницы
});
return view('page.show', compact('menu', 'sidebar', 'page'));
}
... но при таком варианте в кэш лезет много лишнего из объектов (связи, пивоты и прочие ненужные данные). Куда приятнее было бы кешировать не объект $menu, а HTML код готового блока с меню. Даже видел непонятный урок, что так делают, только вот не понял, как потом в шаблоне соединять эти куски кода взятые из кеша.