使用Symfony&;将带有子资源的实体保存到redis中;Api平台
我有两个实体,事件和用户。所以基本上一个用户可以有多个事件。 我有一个EventItemDataProvider,在getItem方法中我做了如下操作:使用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))
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的某种扩展。