领域驱动设计相关的类和实用工具

v6.0.0 2023-05-06 23:29 UTC

This package is auto-updated.

Last update: 2024-09-07 02:13:30 UTC


README

领域驱动设计相关的类和实用工具。

Codacy Badge Latest Stable Version Total Downloads Minimum PHP Version Build Status Coverage Status

模型

值对象

以下值对象类可用

  • EmailAddress
  • 枚举
  • IpAddress
  • IpV4Address
  • IpV6Address
  • MacAddress
  • SingleValueObject (单值对象基类)
  • Url

示例用法

/**
 * @method static Currency EUR()
 * @method static Currency USD()
 */
class Currency extends \BusFactor\Ddd\ValueObject\Enum {
    public const EUR = 'EUR';
    public const USD = 'USD';
}

class Decimal implements \BusFactor\Ddd\ComparableInterface {
    use \BusFactor\Ddd\ComparableTrait;

    // ...
    public function compareTo(\BusFactor\Ddd\ComparableInterface $subject) : int {
    } 
    // ...
}

class Money implements \BusFactor\Ddd\ComparableInterface {
    use \BusFactor\Ddd\ComparableTrait;

    /** @var Decimal $amount*/
    private $amount;
    /** @var Currency $currency */
    private $currency;

    /**
     * @param Decimal $amount
     * @param Currency $currency
     */
    public function __construct(Decimal $amount, Currency $currency) {
        $this->amount = $amount;
        $this->currency = $currency;
    }

    /**
     * @param \BusFactor\Ddd\ComparableInterface $subject
     * @return int
     */
    public function compareTo(\BusFactor\Ddd\ComparableInterface $subject) : int {
        $comparable = $subject instanceof static::class
            && $this->currency === $subject->currency;

        if (!$comparable) {
            throw new LogicException('Incompatible currencies');
        }

        return $this->amount->compareTo($subject->amount);
    }
}

$money = new Money(new Decimal(/* ... */), Currency::EUR());
$otherMoney = new Money(new Decimal(/* ... */), Currency::EUR());