edudobay / doctrine-symfony-serializer

使用Symfony Serializer在Doctrine ORM中映射字段

v0.4.0 2024-05-30 03:09 UTC

This package is auto-updated.

Last update: 2024-09-30 03:56:51 UTC


README

Version License

这是一个使用 Doctrine ORM 映射字段以便使用 Symfony Serializer 组件进行序列化的概念证明,无需为每种可能的数据类型创建映射类型。

有时你可能只需要将复杂数据类型(通常是值对象)存储在 JSON 字段中,而不必担心数据库模式、额外列或表、Doctrine 嵌入式对象自定义映射

安装

此库需要 PHP 8.0 或更高版本。

composer require edudobay/doctrine-symfony-serializer

用法

查看示例目录以获取工作代码示例。

简化的示例

将以下内容添加到您的应用程序设置中

use Edudobay\DoctrineSerializable\ReflectionClassMetadataFactory;
use Edudobay\DoctrineSerializable\SerializationHandler;
use Edudobay\DoctrineSerializable\PersistenceEventSubscriber;

$serializer = ...; // Symfony Serializer
$entityManager = ...; // Doctrine ORM EntityManager

$subscriber = new PersistenceEventSubscriber(new SerializationHandler(
    $serializer,
    // You might want to cache this. See Psr6CacheClassMetadataFactory
    new ReflectionClassMetadataFactory()
));

$entityManager->getEventManager()->addEventSubscriber($subscriber);

在您的实体中,按照您喜欢的格式设置领域对象,并引入一个私有的后备字段使其持久化

use Doctrine\ORM\Mapping as ORM;
use Edudobay\DoctrineSerializable\Attributes\Serializable;

#[ORM\Entity]
class User
{
    // Backing field
    #[ORM\Column('address', type: 'json')]
    private array $_address = [];
    // The actual domain object
    #[Serializable]
    public Address $address;

    // For arrays:
    #[ORM\Column('badges', type: 'json')]
    private array $_badges = [];

    #[Serializable]
    /** @var Badge[] */
    public array $badges;

    // OPTIONAL: use arrayItemType instead of docblock array types
    #[Serializable(arrayItemType: Badge::class)]
    public array $badges;
}