lhellemons/php-value-objects

实现真正的PHP值对象的类、特性和接口

1.1.0 2019-04-15 15:44 UTC

This package is auto-updated.

Last update: 2024-09-18 22:22:48 UTC


README

Build Status

作者:Laurens Hellemons lhellemons@gmail.com

此库包含用于处理PHP中的值对象的实用类、特性和接口。通过使用这些,您可以轻松定义自己的值对象。

阅读完整的文档这里

为什么要使用值对象?

值对象是领域驱动设计(DDD)的核心组件。它们是没有标识符的对象,而是由它们的值定义的。任何处理领域概念的复杂系统最终都需要将某些概念建模为值对象。这些概念的例子包括

  • 日期
  • 货币金额
  • 坐标
  • 地址
  • 物理量,如年龄、长度或重量

此库有助于绕过PHP对值对象的有限支持。通过使用此包提供的类、接口和特性,您可以创建自己的值对象,而无需担心内部实现。

用法

使用composer安装此包。

composer require lhellemons/php-value-objects

然后,在您的设计中使用这些类或特性。

<?php

use SolidPhp\ValueObjects\Enum\EnumTrait;

final class Weekday
{
    use EnumTrait;

    public static function MONDAY(): self
    {
        return self::define('MONDAY');
    }

    public static function TUESDAY(): self
    {
        return self::define('TUESDAY');
    }

    // ...
}

// ...

$monday = Weekday::MONDAY();
$tuesday = Weekday::TUESDAY();
$deliveryDay = WeekDay::MONDAY();

$monday === $deliveryDay; // true
$monday === $tuesday; // false
use SolidPhp\ValueObjects\Value\ValueObjectTrait;

final class EmailAddress
{
    use ValueObjectTrait;

    /** @var string */
    private $emailAddressString;

    private function __construct(string $emailAddressString)
    {
        $this->emailAddressString = $emailAddressString;
    }

    public function of(string $emailAddressString): self
    {
        $normalizedString = strtolower(trim($emailAddressString));
        return static::getInstance($normalizedString);
    }

    public function getString(): string
    {
        return $this->emailAddressString;
    }
}

// ...

$emailAddress = EmailAddress::of("annie@email.com");
$sameEmailAddress = EmailAddress::of(" ANNIE@EMAIL.COM");

$emailAddress === $sameEmailAddress; // true