This package no longer maintained, please, use https://github.com/SlyDeath/laravel-nested-caching instead
Версия 3.* для Laravel 5.8, для 5.6-5.7 использовать релиз 2.*
Добавить пакет в composer.json:
composer require slydeath/laravel5-nested-caching
Открыть config/app.php
и добавить сервис провайдера в массив providers
:
SlyDeath\NestedCaching\NestedCachingServiceProvider::class,
Для размещения файла конфигурации выполнить:
php artisan vendor:publish --provider="SlyDeath\NestedCaching\NestedCachingServiceProvider" --tag=config
Для работы необходимы кэш-драйверы поддерживающие тэгирование - это Memcached или Redis.
В .env
файле для Memcached указываем:
CACHE_DRIVER=memcached
для Redis:
CACHE_DRIVER=redis
Так же для работы Redis необходимо установить пакет predis/predis
:
composer require predis/predis
Чтобы закэшировать любой произвольный кусок HTML, нужн опросто передать в директиву @cache
ключ для кэширования фрагмента:
@cache('simple-cache')
<div>Это произвольный кусок HTML который будет закэширован по ключу "simple-cache"</div>
@endcache
Добавить в класс модели, которая будет кэшироваться, трейт NestedCacheable
:
use SlyDeath\NestedCaching\NestedCacheable;
class User extends Model
{
use NestedCacheable;
}
В шаблоне, для кэширования модели, необходимо передать в директиву @cache
её инстанс:
@cache($user)
<div>Кэширование модели App\User:</div>
<ul>
<li>Имя: {{ $user->name }}</li>
<li>Email: {{ $user->email }}</li>
</ul>
@endcache
Для кэширования модели на определённое время, указываем вторым параметром время жизни в минутах:
@cache($user, 1440)
<div>...</div>
@endcache
Чтобы при обновлении модели так же сбрасывался кэш "модели-родителя",
необходимо обновлять поле updated_at
у модели-родителя:
use SlyDeath\NestedCaching\NestedCacheable;
class CarUser extends Model
{
use NestedCacheable;
protected $touches = ['user']; // Указываем родителя
public function user()
{
return $this->belongsTo(User::class);
}
}
Пример использования:
resources/views/user.blade.php
@cache($user)
<section>
<h2>Автомобили пользователя {{ $user->name }}</h2>
<ul>
@foreach($user->cars as $car)
@include('user-car');
@endforeach
</ul>
</section>
@endcache
resources/views/user-car.blade.php
@cache($car)
<li>{{ $car->brand }}</li>
@endcache
Пример кэширования коллекции:
@cache($users)
@foreach ($users as $user)
@include('user');
@endforeach
@endcache