使用Symfony和Api平台将带有子资源的实体保存到Redis中

时间:2019-07-06 10:26:19

标签: symfony redis doctrine symfony4 api-platform.com

我有2个实体,事件和用户。因此,基本上一个用户可以有多个事件。 我有一个EventItemDataProvider,在getItem方法中我做了类似的事情:

public function getItem(string $resourceClass, $id, string $operationName = null, array $context = []): ?Event
{
    if ($event = $this->cache->get($id, Event::class)) {
        return $event;
    }
    $event = $this->em->getRepository(Event::class)->find($id);
    if($event) {
        $this->cache->set($id, $event, 120);
    }
    return $event;
}

当没有缓存返回数据时,我得到的结果是正确的用户名:

{
  "@context": "/contexts/Event",
  "@id": "/events/20",
  "@type": "Event",
  "title": "new global event 3",
  "description": "A big global event 3",
  "createdAt": "2019-07-05T09:20:48+00:00",
  "owner": {
    "@id": "/users/3",
    "@type": "User",
    "username": "test3"
  }
}

但是,如果我第二次使用相同的方法,它将从缓存(redis)中检索数据,但是这次用户名将是空的:

{
  "@context": "/contexts/Event",
  "@id": "/events/20",
  "@type": "Event",
  "title": "new global event 3",
  "description": "A big global event 3",
  "createdAt": "2019-07-05T09:20:48+00:00",
  "owner": {
    "@id": "/users/3",
    "@type": "User",
    "username": ""
  }
}

为什么我从redis取回我的用户名是空的?

基本上我的缓存类具有以下方法:

public function get(string $uniq, string $className)
{
    $value = $this->cache->getItem('test_key')->get();
    return $value;
}

public function set(string $uniq, object $entity, int $expires = 60)
{
    $save = $this->cache->getItem('test_key');
    $save->set($entity);
    $save->expiresAfter($expires);
    $saved = $this->cache->save($save);
    return $saved;
}

事件实体中的所有者字段:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="events")
 * @ORM\JoinColumn(nullable=false)
 * @Groups({"event:read", "event:write", "event:update"})
 * @Assert\Valid()
 */
private $owner;

我的用户实体中的用户名字段:

/**
 * @ORM\Column(type="string", length=25, unique=true)
 * @Groups({"user:read", "user:write", "user:update", "event:item:get", "event:update"})
 * @Assert\NotBlank(message="Please provide a username")
 */
private $username;

我的Redis缓存配置:

cache:
    app: cache.adapter.redis
    default_redis_provider: "redis://redis"
    pools:
        custom.cache.entity:
            adapter: cache.app
            default_lifetime: 120

为什么当我从Doctrine Repository中检索用户名时填满我的用户名,而当从Redis中检索它时却为空?

使用Xdebug,我可以看到,如果我从Doctrine检索数据,我将得到类似的信息: enter image description here

但是,如果我从缓存中检索数据,我将得到以下信息: enter image description here

在第二种情况下,初始化器->似乎是无限的,所以我认为问题可能在这里,但是我应该怎么做才能解决此问题?

0 个答案:

没有答案
相关问题