妖怪 / doctrine-value-object
简化 Doctrine ORM 的值对象
Requires
- php: ^8.0
- doctrine/dbal: ^3.8|^4.0
- doctrine/orm: ^2.7|^3.1
- webmozart/assert: ^1.11
Requires (Dev)
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^9.4
- squizlabs/php_codesniffer: ^3.9
- symfony/cache: ^5.4|^6.0|^7.0
This package is auto-updated.
Last update: 2024-09-08 13:52:24 UTC
README
此库为您提供了一个简单的方法来处理 值对象,适用于 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许可证保护。