PHPackages                             proklung/cache-proxificator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Caching](/categories/caching)
4. /
5. proklung/cache-proxificator

ActiveLibrary[Caching](/categories/caching)

proklung/cache-proxificator
===========================

Cache proxy for any class.

1.2.6(5y ago)2482MITPHPPHP &gt;=7.1.3

Since May 2Pushed 5y ago1 watchersCompare

[ Source](https://github.com/ProklUng/cache.proxificator)[ Packagist](https://packagist.org/packages/proklung/cache-proxificator)[ RSS](/packages/proklung-cache-proxificator/feed)WikiDiscussions master Synced 6d ago

READMEChangelog (10)Dependencies (4)Versions (13)Used By (2)

Кэширующий проксификатор
========================

[](#кэширующий-проксификатор)

При помощи [FriendsOfPHP/proxy-manager-lts](https://github.com/FriendsOfPHP/proxy-manager-lts) - создается кэширующее прокси над любым объектом и (или) его публичным методом.

Установка
---------

[](#установка)

`composer require proklung/cache-proxificator`

Использование
-------------

[](#использование)

```
use Prokl\CacheProxificator\CacheProxificator;
use Prokl\CacheProxificator\Resolvers\DisableVoidReturnResolver;
use Prokl\CacheProxificator\ReflectionProcessor;

class OriginalObject {
    public function getId() {
        return 1;
    }
}

$decorator = new CacheProxificator(
    new OriginalObject(),
    new Cacher(),
    new ReflectionProcessor([
        new DisableVoidReturnResolver()
    ]),
    ['getModel'],
    'prod'
);

$model = $decorator->getId();
```

После создания проксификатора к методам оригинального объекта обращаться через него. Прокси - в зависимости от
заданной конфигурации - само решит какой метод вызывать - кэшированный или оригинальный.

Альтернативный способ: метод `proxificate(string $method, ...$params)`, обращающийся к заданному методу (кэшированному или оригинальному).

### Кэшер

[](#кэшер)

Кэшером выступает любой объект, реализующий `Symfony\Contracts\Cache\CacheInterface`.

### Ресолверы

[](#ресолверы)

Задаются массивом через конструктор.

Реализуют интерфейс `Prokl\CacheProxificator\Contracts\MethodResolverInterface` с одним методом `supply(ReflectionMethod $reflectionMethod) : bool`, в котором можно решить - кэшировать ли этот метод в принципе или нет.

Например, можно определить - если метод ничего не возвращает, то кэширование бессмысленно. Или в названии метода присутствует слово "cached".

Конструкторы классов всегда исключены из возможности кэширования.

В комплекте идет ресолвер `AnnotationResolver`, определяющий метод, подлежащий кэшированию с помощью аннотации `Cacheble`:

```
use Prokl\CacheProxificator\CacheProxificator;
use Prokl\CacheProxificator\Resolvers\AnnotationResolver;
use Prokl\CacheProxificator\ReflectionProcessor;
use Prokl\CacheProxificator\Resolvers\Annotations\Cacheble;

class OriginalObject {
   /**
     * @Cacheble()
     */
    public function getId() {
        return 1;
    }
}

$decorator = new CacheProxificator(
    new OriginalObject(),
    new Cacher(),
    new ReflectionProcessor([
        new AnnotationResolver(
            container()->get('annotations.reader')
        )
    ]),
    [],
    'prod'
);

$model = $decorator->getId();
```

Последний, опциональный, параметр конструктора - `cachePath` - путь к месту, где хранятся на проде сгенерированные прокси-файлы. По умолчанию - в папке vendor пакета, что исключает инвалидацию в случае изменения оригинальных файлов.

Результат работы метода будет закэширован.

### Жесткая установка методов, подлежащих кэшированию

[](#жесткая-установка-методов-подлежащих-кэшированию)

Задается через конструктор. Если фильтр задан, то ресолверы не исполняются.

### Прегенерация прокси-классов на продакшене

[](#прегенерация-прокси-классов-на-продакшене)

По [мотивам](https://github.com/Ocramius/ProxyManager/blob/2.12.x/docs/tuning-for-production.md).

Если в конструкторе задать параметр `$environment`, отличный от `dev` (по умолчанию), то прокси-классы будут прегенерироваться в отдельные файлы. Путь к кэшу задается защищенным свойством `$cacheDir`, которое подлежит изменению через наследование.

Также, если это свойство пустое, то прегенерация не будет работать вне зависимости от значения окружения.

Абстрактнее
-----------

[](#абстрактнее)

**INTERNAL**

Более абстрактный подход, позволяющий загнать не только кэшер.

Класс `Prokl\CacheProxificator\ProxificatorAbstraction`, где конкретные обработчики [pre-access interceptor](https://github.com/Ocramius/ProxyManager/blob/2.12.x/docs/access-interceptor-value-holder.md) и [post-access interceptor](https://github.com/Ocramius/ProxyManager/blob/2.12.x/docs/access-interceptor-value-holder.md)вынесены в отдельные классы, реализующие интерфейсы `Prokl\CacheProxificator\Contracts\OcramiusProxyHandlerPreInterface` и `Prokl\CacheProxificator\Contracts\OcramiusProxyHandlerPostInterface` соответственно.

Один метод - `public function handler($proxy, $instance, $method, $params, $returnValue, &$returnEarly)`, параметры согласно документации.

Кэшер вынесен в такой класс - `Prokl\CacheProxificator\Handlers\CacheHandler`.

Инициализация:

```
use Prokl\CacheProxificator\Handlers\CacheHandler;
use Prokl\CacheProxificator\ProxificatorAbstraction;
use Prokl\CacheProxificator\ReflectionProcessor;

class OriginalObject {
    public function getId() {
        return 1;
    }
}

// Вынесенный в отдельный класс обработчик кэша.
$cacheHandler = new CacheHandler(
    container()->get('example.cacher'),
    new ReflectionProcessor()
);

$decorator = new ProxificatorAbstraction(
    new OriginalObject,
    new ReflectionProcessor(),
    $cacheHandler,
    null,
    ['getId'],
    'dev'
);

$model = $decorator->getId();
```

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

12

Last Release

1830d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/9210c86ee6734e537eaf22c0f2fe7a965451e340e39e1aae2b74013f24c2660d?d=identicon)[gedovan](/maintainers/gedovan)

---

Top Contributors

[![ProklUng](https://avatars.githubusercontent.com/u/19857467?v=4)](https://github.com/ProklUng "ProklUng (18 commits)")

---

Tags

cachinglibraryphp7

### Embed Badge

![Health badge](/badges/proklung-cache-proxificator/health.svg)

```
[![Health](https://phpackages.com/badges/proklung-cache-proxificator/health.svg)](https://phpackages.com/packages/proklung-cache-proxificator)
```

###  Alternatives

[incenteev/hashed-asset-bundle

Apply an asset version based on a hash of the asset for symfony/asset

25526.7k1](/packages/incenteev-hashed-asset-bundle)[rikudou/psr6-dynamo-db-bundle

PSR-6 and PSR-16 cache implementation using AWS DynamoDB for Symfony

2077.8k](/packages/rikudou-psr6-dynamo-db-bundle)[emag-tech-labs/annotation-cache-bundle

Annotation based caching for services inside a symfony container

1941.4k](/packages/emag-tech-labs-annotation-cache-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
