proklung / cache-proxificator
任何类的缓存代理。
Requires
- php: >=7.1.3
- doctrine/annotations: ^1.10
- friendsofphp/proxy-manager-lts: ^1.0.2
- symfony/cache: ~4 | ~5
Requires (Dev)
README
使用 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 文件夹中,这可以避免在更改原始文件时使缓存失效。
方法的结果将被缓存。
严格设置要缓存的方法
通过构造函数设置。如果设置了过滤器,则解析器不会执行。
生产环境中预生成代理类
请参阅 motivations。
如果构造函数中设置的 $environment
参数与默认的 dev
不同,则代理类将生成到单独的文件中。缓存路径由受保护的属性 $cacheDir
设置,该属性可以通过继承进行更改。
此外,如果该属性为空,则无论环境设置如何,都不会执行预生成。
更抽象
INTERNAL
更抽象的方法,不仅允许缓存器。
类 Prokl\CacheProxificator\ProxificatorAbstraction
,其中具体的处理程序 pre-access interceptor 和 post-access interceptor 被移至单独的类中,这些类分别实现接口 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();