unionworx / laravel-serializes-models-with-cache
此包为Laravel的SerializesModels特性提供了一种快速替换方案,在反序列化模型时利用应用缓存。
Requires
- php: ^8.0
- illuminate/database: ^10.0|^11.0
- illuminate/queue: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^v8.23.2
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-09-13 21:19:21 UTC
README
此包为Laravel的SerializesModels特性提供了一种快速替换方案,在反序列化模型时利用应用缓存。
安装
您可以通过composer安装此包
composer require unionworx/laravel-serializes-models-with-cache
使用方法
要使用SerializesModelsWithCache
特性,只需将您类中的Laravel的SerializesModels
特性替换为SerializesModelsWithCache
即可
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use UnionWorx\LaravelSerializesModelsWithCache\SerializesModelsWithCache; use App\Models\Message; class SendMessage { use Dispatchable, InteractsWithQueue, SerializesModelsWithCache; public Message $message; public function handle() { // Your job logic } }
在底层,此特性使用了SerializesModels
特性的大多数默认行为,但在查询数据库之前会尝试从缓存中检索模型。这使用了Laravel缓存的remember功能来从缓存中检索模型,或者使用默认的SerializesModels
行为并存储结果。
属性
您可以使用属性进一步自定义缓存行为
CacheKey
:为特定属性定义一个自定义缓存键。CacheTTL
:为属性设置自定义的生存时间(TTL)。CacheSkip
:跳过特定属性的缓存。
use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheKey; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheTTL; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheSkip; use App\Models\User; use App\Models\Message; class SendMessage { use Dispatchable, InteractsWithQueue, SerializesModelsWithCache; #[CacheKey(key: 'custom_key_{id}')] #[CacheTTL(ttl: 120)] public Message $message; #[CacheSkip] public User $user; public function handle() { // Your job logic } }
方法
或者,您可以使用cacheKey
、cacheTTL
和cacheSkip
方法来自定义缓存行为
use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheKey; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheTTL; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheSkip; use App\Models\User; use App\Models\Message; class SendMessage { use Dispatchable, InteractsWithQueue, SerializesModelsWithCache; public Message $message; public User $user; public function handle() { // Your job logic } public function cacheKey(string $propertyName, mixed $id): ?string { if ($propertyName === 'message') { return 'custom_key_' . $id; } } public function cacheTTL(): array|DateInterval|DateTimeInterface|int|null { return [ 'message' => 120, ]; } public function cacheSkip(): ?array { return [ 'user', ]; } }
缓存前缀
默认情况下,缓存键使用以下模式生成:model_classname_id
。这意味着在多个上下文中使用的模型将共享相同的缓存键。在大多数情况下这会有所帮助,但您也可以通过向您的类添加一个cachePrefix
方法来进一步隔离缓存。这将应用于所有键,即使使用自定义缓存键。
use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheKey; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheTTL; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheSkip; use App\Models\Message; class SendMessage { use Dispatchable, InteractsWithQueue, SerializesModelsWithCache; #[CacheKey(key: 'custom_key_{id}')] public Message $message; public function handle() { // Your job logic } public function cachePrefix(): ?string { return get_class($this); } }
缓存存储
默认情况下,使用的缓存存储是在您的Laravel配置中定义的默认缓存存储。您可以通过向您的类添加一个cacheStoreName
方法来覆盖此设置。
use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheKey; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheTTL; use UnionWorx\LaravelSerializesModelsWithCache\Attributes\CacheSkip; use App\Models\Message; class SendMessage { use Dispatchable, InteractsWithQueue, SerializesModelsWithCache; #[CacheKey(key: 'custom_key_{id}')] public Message $message; public function handle() { // Your job logic } public function cacheStoreName(): ?string { return 'file'; } }
测试
您可以通过composer运行包测试
composer test
变更日志
请参阅CHANGELOG以获取有关最近更改的更多信息。
贡献
请参阅CONTRIBUTING以获取详细信息。
安全
如果您发现任何安全相关问题,请通过电子邮件chris@unionworx.cloud联系,而不是使用问题跟踪器。
致谢
许可协议
MIT。有关更多信息,请参阅许可文件。