proklung/cache-proxificator

任何类的缓存代理。

1.2.6 2021-05-12 13:40 UTC

This package is auto-updated.

Last update: 2024-09-12 20:41:02 UTC


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 interceptorpost-access interceptor 被移至单独的类中,这些类分别实现接口 Prokl\CacheProxificator\Contracts\OcramiusProxyHandlerPreInterfaceProkl\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();