M
M
Mikhail Nosov2018-12-13 15:23:02
Laravel
Mikhail Nosov, 2018-12-13 15:23:02

How to cache views in Laravel 5.6?

I can't figure out how to output a template cached by individual elements.
In all lessons, view is called from the controller for the entire page at once.
For example, let's take this code:

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

I can cache the whole page at once like this:
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;
}

But I have the same menu for all pages, why generate it for each, if you can immediately for all and then take it from the cache.
I also want to cache the page data forever, and update it manually when the page is refreshed, and I want to cache the side navigation data for a week, as the popularity of articles changes and new items appear.
There is an option to cache the objects themselves like this:
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'));
}

... but with this option, a lot of unnecessary objects (links, pivots and other unnecessary data) get into the cache. It would be much nicer to cache not the $menu object, but the HTML code of the finished block with the menu. I even saw an incomprehensible lesson that they do this, but I didn’t understand how to then combine these pieces of code taken from the cache in the template.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
T
Tesla, 2018-12-15
@Tesla

In order not to cache everything in each controller, you can do the same in View Composer , and menu templates, sidebars and others can simply be included in the desired template.
Essentially, to cache html (almost nothing to gain), you can use a widget system, a homemade one, or something like arrilot/laravel-widgets . You call the widget itself in the template, and the widget already resolves what it gives and how it caches.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question