doekenorg/cache-middleware

PSR-6 缓存池的实验性中间件装饰器

v0.1.0 2022-05-21 15:30 UTC

This package is auto-updated.

Last update: 2024-09-21 23:30:01 UTC


README

Latest Version on Packagist

这是一个实验性软件包,为任何PSR-6 缓存池提供中间件。

用法

要应用中间件,您需要使用 DoekeNorg\CacheMiddleware\MiddlewareDecorator 装饰您的 PSR-6 缓存池。装饰器的构造函数接收装饰后的缓存池以及可选的中间件类列表。您还可以通过在装饰器上调用 addMiddleware(...$middlewares) 方法来添加更多中间件。

use DoekeNorg\CacheMiddleware\MiddlewareCachePool;

$regular_psr6_cache_pool = ...; // your current PSR-6 cache pool
$decorator_cache_pool = new MiddlewareCachePool($regular_psr6_cache_pool, ...$middlewares);
//or
$decorator_cache_pool = new MiddlewareCachePool($regular_psr6_cache_pool);
$decorator_cache_pool->addMiddleware(...$middlewares);

中间件类型

本软件包提供了三个中间件接口

  • MiddlewareGetInterface:此中间件与 ->getItem()->getItems() 一起调用
  • MiddlewareSaveInterface:此中间件与 ->save()->safeDefered() 一起调用
  • MiddlewareDeleteInterface:此中间件与 ->deleteItem()->deleteItems() 一起调用

实现接口

每个接口都有一个名为 process<Type> 的方法,该方法在中间件处理过程中被调用。因此,单个中间件类可以实现多个中间件接口,并实现一个共同的目标。

use DoekeNorg\CacheMiddleware\MiddlewareGetInterface;
use DoekeNorg\CacheMiddleware\MiddlewareSaveInterface;
use DoekeNorg\CacheMiddleware\MiddlewareDeleteInterface;
use Psr\Cache\CacheItemInterface;

final class ExampleMiddleware implements MiddlewareGetInterface, MiddlewareSaveInterface, MiddlewareDeleteInterface {
    public function processGet(string $key, callable $next): CacheItemInterface {
        $cache_item = $next($key);
        // do something to the cache item
        return $cache_item;
    }
    
    public function processSave(CacheItemInterface $cacheItem, callable $next): bool {
        // do something to the cache item
        return $next($cacheItem);
    }
    
    public function processDelete(string $key, callable $next): bool {
        // perform some action based on the key or the deleted result.
        return $next($key);
    }
}

注意

此软件包是一个有趣的实验,旨在查看中间件模式是否可以在 PSR-6 缓存周围使用。该软件包正在开发中,实现可以在非稳定阶段发生变化。只要这是 0.*.* 版本,请将每个 次要 更改视为 主要 更新。

警告:虽然可以更改方法的缓存键,但我不建议在中间件中这样做。请使用它来更新缓存项(添加标签、删除给定键的其他项等)。

注意事项:为了在所有项目上触发中间件并结合 getItems()deleteItems(),这些函数 在装饰后的缓存池上调用这些函数,而是在装饰器上多次调用 getItem()deleteItem()。从技术上讲,这使得装饰器成为一个代理,但实际上它仍然是一个装饰器。只是请注意,如果您需要调用内部方法,这个软件包可能不适合您,您应该使用自定义装饰器。

变更日志

有关最近更改的更多信息,请参阅变更日志

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件