WebSEOkz
@WebSEOkz
SEOшник, веб-разработчик

Как кешировать view в Laravel 5.6?

Не могу понять, как выводить шаблон зекешированный отдельными элементами.

Во всех уроках из контроллера вызывается 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 код готового блока с меню. Даже видел непонятный урок, что так делают, только вот не понял, как потом в шаблоне соединять эти куски кода взятые из кеша.
  • Вопрос задан
  • 431 просмотр
Пригласить эксперта
Ответы на вопрос 1
Tesla
@Tesla
Чтобы не кэшировать все в каждом контроллере, вы то же самое можете делать в View Composer, а шаблоны меню, сайдбара и прочие просто инклудить в нужном шаблоне.

А по существу, чтобы кэшировать html (почти ничего не выиграете), можете использовать систему виджетов, самодельную или что-то вроде arrilot/laravel-widgets. Вызываете сам виджет в шаблоне, а уже виджет разруливает, что он отдает и как кэширует.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы