妖怪/doctrine-value-object

简化 Doctrine ORM 的值对象

v0.2.0 2024-07-08 13:34 UTC

README

Tests Coverage Contributors

Latest Stable Version Downloads Monthly

此库为您提供了一个简单的方法来处理 值对象,适用于 Doctrine ORM 应用程序。

它将为您节省为每种不同的值对象类型创建 Doctrine 类型的麻烦。

安装

composer require yokai/doctrine-value-object

设置

您需要将您的值对象类型注册到 Doctrine 类型系统中。

use Doctrine\DBAL\Types\Type;
use Yokai\DoctrineValueObject\Doctrine\Types;

(new Types(['doctrine_type_name' => MyValueObject::class]))
    ->register(Type::getTypeRegistry());

如果您正在使用 Symfony,您可以在内核构建时注册您的值对象类型。

use Doctrine\DBAL\Types\Type;
use Yokai\DoctrineValueObject\Doctrine\Types;

class Kernel extends BaseKernel
{
    private const DOCTRINE_VALUE_OBJECTS = [
        'doctrine_type_name' => MyValueObject::class,
    ];

    public function __construct(string $environment, bool $debug)
    {
        parent::__construct($environment, $debug);
        (new Types(self::DOCTRINE_VALUE_OBJECTS))->register(Type::getTypeRegistry());
    }
}

您还可以利用属性的力量,结合 olvlvl/composer-attribute-collector,一次性自动注册所有您的值对象。

use Doctrine\DBAL\Types\Type;
use Yokai\DoctrineValueObject\Doctrine\Types;

#[\Attribute(\Attribute::TARGET_CLASS)]
final readonly class AsValueObject
{
    public function __construct(
        public string $name,
    ) {
    }
}

#[AsValueObject(MyValueObject::DOCTRINE_TYPE_NAME)]
final class MyValueObject implements \Yokai\DoctrineValueObject\StringValueObject
{
    public const DOCTRINE_TYPE_NAME = 'doctrine_type_name';
}

$types = [];
foreach (Attributes::findTargetClasses(AsValueObject::class) as $target) {
    /** @var AsValueObject $attribute */
    $attribute = $target->attribute;
    $types[$attribute->name] = $target->name;
}
(new Types($types))->register(Type::getTypeRegistry());

使用

完成设置后,您将能够在任何实体中使用您的值对象类型。

<?php

namespace Yokai\DoctrineValueObject\Tests;

use Doctrine\ORM\Mapping as ORM;

final class Entity
{
    #[ORM\Column(type="doctrine_type_name")]
    public MyValueObject $status;
}

值对象类型

值对象是围绕现有 doctrine 类型构建的包装器。

让我们看看有哪些包装器,并为每个包装器提供一个示例。

字符串

假设您有一个应用程序,该应用程序在数据库中存储电话号码。您经常需要确定号码的来源国家。

您可以将此逻辑集中在一个 PhoneNumber 字符串值对象 中。该对象将以 字符串 的形式存储在数据库中,但由 Doctrine 重新填充 为此对象。

请参阅测试中的 PhoneNumber 代码

日期时间

假设您有一个应用程序,该应用程序存储用户的出生日期。您经常需要确定用户的年龄,并对该值进行规则设置。

您可以将此逻辑集中在一个 Birthdate 日期时间值对象 中。该对象将以 不可变的日期时间 的形式存储在数据库中,但由 Doctrine 重新填充 为此对象。

请参阅测试中的 Birthdate 代码

整数

假设您有一个应用程序,该应用程序存储用户状态。您经常需要对此值进行规则设置。

您可以将此逻辑集中在一个 Status 整数值对象 中。该对象将以 整数 的形式存储在数据库中,但由 Doctrine 重新填充 为此对象。

请参阅测试中的 Status 代码

对象

⚠️ 如果您正在寻找每个属性都存储在表列中的值对象:请使用 Doctrine Embeddables

⚠️ 如果您正在寻找存储为 JSON 的多属性多态值对象:请使用 dunglas/doctrine-json-odm

假设您有一个应用程序,该应用程序存储用户通知偏好。您希望将多个信息存储为 JSON 对象。

您可以将此逻辑集中在一个 Notifications 对象值对象 中。该对象将以 JSON 对象 的形式存储在数据库中,但由 Doctrine 重新填充 为此对象。

请参阅测试中的 Notifications 代码

集合

想象一下,你有一个应用程序需要在属性中存储多个电话号码。你可以通过一个名为PhoneNumbers集合值对象来集中处理这种类型提示。

该对象将在数据库中以JSON数组格式存储,但由Doctrine将它们重新注入到这个对象中。

请参阅测试中的PhoneNumbers代码:PhoneNumbers 代码

贡献

请随意提交一个问题或一个拉取请求

该库最初由Yann Eugoné创建。查看贡献者列表

许可证

本库受MIT许可证保护。