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 3w 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 41% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity55

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

1877d 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

[symfony/framework-bundle

Provides a tight integration between Symfony components and the Symfony full-stack framework

3.6k251.7M11.5k](/packages/symfony-framework-bundle)[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.9M388](/packages/easycorp-easyadmin-bundle)[oro/platform

Business Application Platform (BAP)

645143.5k114](/packages/oro-platform)[tempest/framework

The PHP framework that gets out of your way.

2.2k34.4k14](/packages/tempest-framework)[open-dxp/opendxp

Content &amp; Product Management Framework (CMS/PIM)

9421.6k61](/packages/open-dxp-opendxp)[concrete5/core

Concrete core subtree split

20166.1k50](/packages/concrete5-core)

PHPackages © 2026

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