使用Symfony&;将带有子资源的实体保存到redis中;Api平台

使用Symfony&;将带有子资源的实体保存到redis中;Api平台,symfony,redis,doctrine,symfony4,api-platform.com,Symfony,Redis,Doctrine,Symfony4,Api Platform.com,我有两个实体,事件和用户。所以基本上一个用户可以有多个事件。 我有一个EventItemDataProvider,在getItem方法中我做了如下操作: public function getItem(string $resourceClass, $id, string $operationName = null, array $context = []): ?Event { if ($event = $this->cache->get($id, Event::class))

我有两个实体,事件和用户。所以基本上一个用户可以有多个事件。 我有一个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": ""
  }
}
当返回数据时,没有缓存,我得到的结果是正确的,用户名正确:

{
  "@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)中检索数据,但这次用户名将为空,如下所示:

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": ""
  }
}
为什么我从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存储库检索时是填充的,而在我从Redis检索时是空的

使用Xdebug,我可以看到,如果我从条令中检索数据,我会得到类似的结果:

但如果我从缓存中检索数据,我会得到类似的结果:


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

你好,RaKoDev,我今天也面临同样的问题。你的修好了吗?ThanksI停用了缓存。这个项目不是活的。如果您找到了解决方案,请告诉我:)我认为在Redis中存储代理之类的东西是个坏主意,因为它包含闭包。闭包将对象绑定到代码和临时变量。其中可能有对服务的引用,在下一个请求中不再有效。如果您真的想缓存实体数据,这将是Doctrine要做的事情,或者是Doctrine的某种扩展。