unionworx/laravel-serializes-models-with-cache

此包为Laravel的SerializesModels特性提供了一种快速替换方案,在反序列化模型时利用应用缓存。

0.1.0 2024-06-12 03:05 UTC

This package is auto-updated.

Last update: 2024-09-13 21:19:21 UTC


README

Latest Version on Packagist Total Downloads GitHub Actions

此包为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
    }
}

方法

或者,您可以使用cacheKeycacheTTLcacheSkip方法来自定义缓存行为

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。有关更多信息,请参阅许可文件