paveldanilin / response-cache-bundle
一个Symfony响应缓存包
dev-main
2022-02-02 22:18 UTC
Requires
- php: >=7.4
- ext-json: *
- doctrine/annotations: 1.11.*|1.12.*|1.13.*
- paveldanilin/reflection-scanner: ^0.0
- symfony/console: ^4.4|^5.0
- symfony/expression-language: ^4.4|^5.0
- symfony/framework-bundle: ^4.4|^5.0
- symfony/lock: ^4.4|^5.0
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^9
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-09-29 06:14:36 UTC
README
安装
composer require paveldanilin/response-cache-bundle
配置
# Default values response_cache: lock: factory: 'lock.response_cache.factory' controller: dir: '%kernel.project_dir%/src'
lock.factory
:一个锁工厂服务,了解更多关于锁组件配置的信息。
controller.dir
:用于注解扫描的控制器目录。
用法
@Cacheable
为控制器操作方法启用缓存行为。
@Cacheable( pool="<cache.pool.name>", key="<item.key.name>", ttl="<expires.after.sec>", condition="<request.condition.expression>" )
默认参数
key
- 类名和方法名的连接:App\Controller\MyController_doHeavyComputation
pool
-cache.app
ttl
- null(永远不会过期)condition
- null
/** * @Cacheable() * @Route("/api/v1/work", methods={"GET"}, name="do.work") * @return JsonResponse */ public function doWork(Request $request): JsonResponse { $data = doHeavyComputations(); return new JsonResponse($data); }
键
有两种类型的键
- 静态
- 动态
静态键
静态键是一个空值 <className_methodName>
或一个字符串 '<static_key>'
。
例如:@Cacheable()
或 @Cacheable(key='my_item')
动态键
动态键从井号开始,即 #<expression>
。
Symfony表达式语言 用于动态键的计算。
在表达式中可以使用以下变量
在表达式中可以使用以下函数
示例
@Cacheable(key="#request.getMethod()~request.getRequestUri()")
@Cacheable(key="#query_val('id', 'def_value')")
@Cacheable(key="#query_val(['id', 'x_query_param'])")
@Cacheable(key="#route_val('id')")
@Cacheable(key="#route_val(['id', 'x_route_param'])")
// Request body: {"account": {"id": 123}} // The resolved key: 123 @Cacheable(key="#body_json('account.id')")
池
您可以 定义 自己的缓存池并使用它代替默认的 cache.app
。请注意,缓存池必须定义为公共的。
TTL
缓存项的存活时间(秒)。如果没有定义,将使用池的默认值。
条件
如果我们想对何时激活注解有更多的控制,我们可以使用一个条件参数来参数化@Cacheable,该参数接受一个Symfony表达式,并确保根据评估该表达式来缓存结果。
@CacheEvict
@CacheEvict(pool=<cache.pool.name>, key=<item.key.name>)