Сохранить сущность с субресурсом в Redis с помощью Symfony & Api Platform - PullRequest
1 голос
/ 06 июля 2019

У меня есть 2 объекта, Event & User.Таким образом, в основном пользователь может иметь несколько событий.У меня есть 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;
}

Поле владельца в моем объекте Event:

/**
 * @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

Во втором случае initializer -> это кажется бесконечным, поэтому я думаю, что проблема, вероятно, здесь, но что я должен сделать, чтобы решить эту проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...