{"id":18513685,"url":"https://github.com/proklung/cache.proxificator","last_synced_at":"2026-04-30T13:33:34.498Z","repository":{"id":57045115,"uuid":"363582682","full_name":"ProklUng/cache.proxificator","owner":"ProklUng","description":"Кэширующее прокси над любым объектом и (или) его публичным методом","archived":false,"fork":false,"pushed_at":"2021-05-12T13:41:05.000Z","size":44,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-25T21:24:03.835Z","etag":null,"topics":["caching","library","php7"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ProklUng.png","metadata":{"files":{"readme":"readme.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-02T06:27:47.000Z","updated_at":"2024-09-17T10:05:37.000Z","dependencies_parsed_at":"2022-08-24T03:40:07.891Z","dependency_job_id":null,"html_url":"https://github.com/ProklUng/cache.proxificator","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fcache.proxificator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fcache.proxificator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fcache.proxificator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fcache.proxificator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ProklUng","download_url":"https://codeload.github.com/ProklUng/cache.proxificator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239230947,"owners_count":19603987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["caching","library","php7"],"created_at":"2024-11-06T15:40:14.400Z","updated_at":"2026-04-30T13:33:34.484Z","avatar_url":"https://github.com/ProklUng.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Кэширующий проксификатор\n\nПри помощи [FriendsOfPHP/proxy-manager-lts](https://github.com/FriendsOfPHP/proxy-manager-lts) - создается кэширующее прокси над любым объектом\nи (или) его публичным методом.\n\n## Установка\n\n`composer require proklung/cache-proxificator`\n\n## Использование\n\n```php\nuse Prokl\\CacheProxificator\\CacheProxificator;\nuse Prokl\\CacheProxificator\\Resolvers\\DisableVoidReturnResolver;\nuse Prokl\\CacheProxificator\\ReflectionProcessor;\n\nclass OriginalObject {\n    public function getId() {\n        return 1;\n    }   \n}\n\n$decorator = new CacheProxificator(\n    new OriginalObject(),\n    new Cacher(),\n    new ReflectionProcessor([\n        new DisableVoidReturnResolver()\n    ]),\n    ['getModel'],\n    'prod' \n);\n\n$model = $decorator-\u003egetId();\n```\n\nПосле создания проксификатора к методам оригинального объекта обращаться через него. Прокси - в зависимости от  \nзаданной конфигурации - само решит какой метод вызывать - кэшированный или оригинальный.\n\nАльтернативный способ: метод `proxificate(string $method, ...$params)`, обращающийся к заданному методу (кэшированному или оригинальному).\n\n### Кэшер\n\nКэшером выступает любой объект, реализующий `Symfony\\Contracts\\Cache\\CacheInterface`.\n\n### Ресолверы\n\nЗадаются массивом через конструктор. \n\nРеализуют интерфейс `Prokl\\CacheProxificator\\Contracts\\MethodResolverInterface` с одним\nметодом `supply(ReflectionMethod $reflectionMethod) : bool`, в котором можно решить - кэшировать ли этот метод в принципе\nили нет. \n\nНапример, можно определить - если метод ничего не возвращает, то кэширование бессмысленно. Или в названии метода\nприсутствует слово \"cached\".\n\nКонструкторы классов всегда исключены из возможности кэширования.\n\nВ комплекте идет ресолвер `AnnotationResolver`, определяющий метод, подлежащий кэшированию с помощью аннотации \n`Cacheble`:\n\n```php\nuse Prokl\\CacheProxificator\\CacheProxificator;\nuse Prokl\\CacheProxificator\\Resolvers\\AnnotationResolver;\nuse Prokl\\CacheProxificator\\ReflectionProcessor;\nuse Prokl\\CacheProxificator\\Resolvers\\Annotations\\Cacheble;\n\nclass OriginalObject {\n   /**\n     * @Cacheble()\n     */\n    public function getId() {\n        return 1;\n    }   \n}\n\n$decorator = new CacheProxificator(\n    new OriginalObject(),\n    new Cacher(),\n    new ReflectionProcessor([\n        new AnnotationResolver(\n            container()-\u003eget('annotations.reader')\n        )\n    ]),\n    [],\n    'prod'    \n);\n\n$model = $decorator-\u003egetId();\n```\n\nПоследний, опциональный, параметр конструктора - `cachePath` - путь к месту, где хранятся на проде сгенерированные прокси-файлы.\nПо умолчанию - в папке vendor пакета, что исключает инвалидацию в случае изменения оригинальных файлов.\n\nРезультат работы метода будет закэширован.\n\n### Жесткая установка методов, подлежащих кэшированию\n\nЗадается через конструктор. Если фильтр задан, то ресолверы не исполняются.\n\n### Прегенерация прокси-классов на продакшене\n\nПо [мотивам](https://github.com/Ocramius/ProxyManager/blob/2.12.x/docs/tuning-for-production.md).\n\nЕсли в конструкторе задать параметр `$environment`, отличный от `dev` (по умолчанию), то прокси-классы будут прегенерироваться\nв отдельные файлы. Путь к кэшу задается защищенным свойством `$cacheDir`, которое подлежит изменению через наследование.\n\nТакже, если это свойство пустое, то прегенерация не будет работать вне зависимости от значения окружения.\n \n## Абстрактнее\n\n**INTERNAL**\n\nБолее абстрактный подход, позволяющий загнать не только кэшер.\n\nКласс `Prokl\\CacheProxificator\\ProxificatorAbstraction`, где конкретные обработчики [pre-access interceptor](https://github.com/Ocramius/ProxyManager/blob/2.12.x/docs/access-interceptor-value-holder.md) и\n[post-access interceptor](https://github.com/Ocramius/ProxyManager/blob/2.12.x/docs/access-interceptor-value-holder.md)\nвынесены в отдельные классы, реализующие интерфейсы `Prokl\\CacheProxificator\\Contracts\\OcramiusProxyHandlerPreInterface` и `Prokl\\CacheProxificator\\Contracts\\OcramiusProxyHandlerPostInterface` соответственно.\n\nОдин метод - `public function handler($proxy, $instance, $method, $params, $returnValue, \u0026$returnEarly)`, параметры согласно документации.\n\nКэшер вынесен в такой класс - `Prokl\\CacheProxificator\\Handlers\\CacheHandler`.\n\nИнициализация:\n\n```php\nuse Prokl\\CacheProxificator\\Handlers\\CacheHandler;\nuse Prokl\\CacheProxificator\\ProxificatorAbstraction;\nuse Prokl\\CacheProxificator\\ReflectionProcessor;\n\nclass OriginalObject {\n    public function getId() {\n        return 1;\n    }   \n}\n\n// Вынесенный в отдельный класс обработчик кэша.\n$cacheHandler = new CacheHandler(\n    container()-\u003eget('example.cacher'),\n    new ReflectionProcessor()\n);\n\n$decorator = new ProxificatorAbstraction(\n    new OriginalObject,\n    new ReflectionProcessor(),\n    $cacheHandler,\n    null,\n    ['getId'],\n    'dev'    \n);\n\n$model = $decorator-\u003egetId();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fcache.proxificator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproklung%2Fcache.proxificator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fcache.proxificator/lists"}