Skip to content

Instantly share code, notes, and snippets.

@floatflower
Last active February 22, 2020 14:19
Show Gist options
  • Save floatflower/57d64a4740a094ec54c48ee0d55c9a17 to your computer and use it in GitHub Desktop.
Save floatflower/57d64a4740a094ec54c48ee0d55c9a17 to your computer and use it in GitHub Desktop.
<?php
namespace App\EventSubscriber;
use App\CacheAdapterProvider\CacheAdapterProvider;
use App\Enum\CacheType;
use App\Event\User\AfterUserCreated;
use App\Event\User\AfterUserDeleted;
use App\Event\User\AfterUserUpdated;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserCacheSubscriber implements EventSubscriberInterface
{
/**
* @var \Symfony\Component\Cache\Adapter\FilesystemAdapter|\Symfony\Component\Cache\Adapter\RedisAdapter
*/
private $cacheAdapter;
public function __construct(CacheAdapterProvider $cacheAdapterProvider)
{
$this->cacheAdapter = $cacheAdapterProvider->get(CacheType::REDIS);
}
/**
* 當 User Entity 時主動將資料寫入快取
*
* @param AfterUserCreated $event
*/
public function onAfterUserCreated(AfterUserCreated $event)
{
/**
* @var CacheItem $cacheItem
*/
$cacheItem = $this->cacheAdapter->getItems($event->getUser()->getUuid());
$cacheItem->expiresAfter(43200);
$cacheItem->set(serialize($event->getUser()));
$this->cacheAdapter->save($cacheItem);
}
/**
* 當 User Entity 更新時 Purge 並 該實體的 Cache
*
* @param AfterUserUpdated $event
*/
public function onAfterUserUpdate(AfterUserUpdated $event)
{
$uuid = $event->getUser()->getUuid();
if($uuid) $this->cacheAdapter->delete($uuid);
/**
* @var CacheItem $cacheItem
*/
$cacheItem = $this->cacheAdapter->getItems($event->getUser()->getUuid());
$cacheItem->expiresAfter(43200);
$cacheItem->set(serialize($event->getUser()));
$this->cacheAdapter->save($cacheItem);
}
/**
* 當 User Entity 更新時 Purge 該實體的 Cache
*
* @param AfterUserDeleted $event
*/
public function onAfterUserDelete(AfterUserDeleted $event)
{
$uuid = $event->getUser()->getUuid();
if($uuid) $this->cacheAdapter->delete($uuid);
}
public static function getSubscribedEvents()
{
return [
AfterUserCreated::NAME => 'onAfterUserCreated',
AfterUserUpdated::NAME => 'onAfterUserUpdate',
AfterUserDeleted::NAME => 'onAfterUserDelete'
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment