Doctrine отображает тип сущности на id, id на сущность - PullRequest
0 голосов
/ 27 сентября 2019

Как я уже сказал в заголовке, я хочу преобразовать объект в идентификатор (int / string) и обратно из идентификатора в объект.Обычно я работал бы с отношениями сущностей, но в этом случае я не знаю другой сущности / связки, и он должен работать независимо.

Я думаю, я мог бы использовать для этого типы отображения доктрин, но как я могу внедритьмой пользовательский загрузчик объектов?Поэтому, возможно, я могу использовать обратный вызов для извлечения данных.

Вот моя идея (псевдокод):

class User {
    public function getId() { return 'IAmUserBobAndThisIdMyId'; }
}

class Meta {
    private $user;  // <== HERE I NEED THE MAGIC
    public function setUser($user) { $this->user = user; }
}

$user = new User();
$meta = new Meta();
$meta->setUser($user);
$em->persist($meta);  // <== HERE THE MAPPING TYPE SHOULD CONVERT THE ENTITY

Знаю, что я хочу, чтобы объект в моей базе данных был таким: user:IAmUserBobAndThisIdMyId

И в обратном направлении:

$meta = $repository->findOneById(1);  // HERE I NEED THE MAGIC AGAIN
$user = $meta->getUser();
echo $user->getId();

// output: IAmUserBobAndThisIdMyId

Пока все очень просто ... Но сейчас мне нужно немного логики и доступа к базе данных, чтобы восстановить эту сущность.Загрузка проста, , но как я могу вставить это в мой класс типа отображения ?

Я прочитал документацию доктрины , и мне было интересно, смогу ли я использоватьменеджер событий я получаю из AbstractPlatform $platform через параметр.Или, может быть, есть лучший способ?

1 Ответ

0 голосов
/ 27 сентября 2019

Вы можете попробовать что-то вроде этого, но я не проверял это.Также вы можете использовать события doctrine postLoad и postPersist / postUpdate для преобразования вашей сущности User в целое число и обратно.

doctrine.yaml

doctrine:
    dbal:
        ...
        types:
            user: App\Doctrine\DBAL\Type\UserType
        ...

UserType.php

<?php

namespace App\Doctrine\DBAL\Type;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\IntegerType;
use App\Repository\UserRepository;
use App\Entity\User;

class UserType extends IntegerType
{
    const NAME = 'user';

    private $userRepository;

    public function __construct(UserRepository $userRepository)
    {
       $this->userRepository = $userRepository;
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $this->userRepository->find($value);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if (!$value instanceof User) {
            throw new \InvalidArgumentException("Invalid value");
        }

        return $value->getId();
    }

    public function getName()
    {
        return self::NAME;
    }
}
...