Skip to content

Commit

Permalink
ObjectSet value objects improvements
Browse files Browse the repository at this point in the history
- improved item type validation in `AppendOnlyValueObjectSetTrait` and `ValueObjectSetTrait`
- added method `AppendOnlyValueObjectSetTrait::appendAll()`
- added method `AppendOnlyValueObjectSetTrait::merge()`
  • Loading branch information
tg666 committed Oct 30, 2023
1 parent 0038fbf commit 82f77f9
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use SixtyEightPublishers\ArchitectureBundle\Domain\Exception\InvalidNativeValueTypeException;
use SixtyEightPublishers\ArchitectureBundle\Domain\Exception\ValueObjectSetException;
use function array_merge;
use function assert;
use function count;
use function is_array;
Expand All @@ -14,6 +15,9 @@

trait AppendOnlyValueObjectSetTrait
{
/** @var class-string<ValueObjectInterface>|null */
private static ?string $validItemClassname = null;

/**
* @param array<ValueObjectInterface> $items
*/
Expand Down Expand Up @@ -67,12 +71,8 @@ public static function fromSafeNative(mixed $native): static
*/
public static function fromItems(array $items): static
{
$itemClassname = self::getValidItemClassname();

foreach ($items as $item) {
if (!$item instanceof $itemClassname) {
throw ValueObjectSetException::invalidItemPassed(static::class, $itemClassname, $item);
}
self::validateItem($item);
}

return new static($items);
Expand Down Expand Up @@ -109,10 +109,36 @@ public function equals(ValueObjectInterface $object): bool

public function append(ValueObjectInterface $item): static
{
self::validateItem($item);

$items = $this->all();
$items[] = $item;

return self::fromItems($items);
return new static($items);
}

/**
* @param array<int, ValueObjectInterface> $items
*/
public function appendAll(array $items): static
{
$allItems = $this->all();

foreach ($items as $item) {
self::validateItem($item);

$allItems[] = $item;
}

return new static($allItems);
}

public function merge(self $valueObject): static
{
return new static(array_merge(
$this->all(),
$valueObject->all(),
));
}

/**
Expand All @@ -138,6 +164,10 @@ abstract protected static function getItemClassname(): string;
*/
private static function getValidItemClassname(): string
{
if (null !== self::$validItemClassname) {
return self::$validItemClassname;
}

/** @var class-string $itemClassname */
$itemClassname = static::getItemClassname();

Expand All @@ -149,6 +179,15 @@ private static function getValidItemClassname(): string
throw ValueObjectSetException::declaredItemTypeMustBeValueObjectImplementor(static::class, $itemClassname);
}

return $itemClassname;
return self::$validItemClassname = $itemClassname;
}

private static function validateItem(ValueObjectInterface $item): void
{
$itemClassname = self::getValidItemClassname();

if (!$item instanceof $itemClassname) {
throw ValueObjectSetException::invalidItemPassed(static::class, $itemClassname, $item);
}
}
}
28 changes: 21 additions & 7 deletions src/ArchitectureBundle/Domain/ValueObject/ValueObjectSetTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@

trait ValueObjectSetTrait
{
/** @var class-string<ValueObjectInterface>|null */
private static ?string $validItemClassname = null;

/**
* @param array<ValueObjectInterface> $items
*/
Expand Down Expand Up @@ -66,12 +69,8 @@ public static function fromSafeNative(mixed $native): static
*/
public static function fromItems(array $items): static
{
$itemClassname = self::getValidItemClassname();

foreach ($items as $item) {
if (!$item instanceof $itemClassname) {
throw ValueObjectSetException::invalidItemPassed(static::class, $itemClassname, $item);
}
self::validateItem($item);
}

return new static($items);
Expand Down Expand Up @@ -111,10 +110,12 @@ public function with(ValueObjectInterface $item): static
$items = $this->all();

if (!$this->has($item)) {
self::validateItem($item);

$items[] = $item;
}

return self::fromItems($items);
return new static($items);
}

public function without(ValueObjectInterface $item): static
Expand Down Expand Up @@ -166,6 +167,10 @@ abstract protected static function getItemClassname(): string;
*/
private static function getValidItemClassname(): string
{
if (null !== self::$validItemClassname) {
return self::$validItemClassname;
}

/** @var class-string $itemClassname */
$itemClassname = static::getItemClassname();

Expand All @@ -177,6 +182,15 @@ private static function getValidItemClassname(): string
throw ValueObjectSetException::declaredItemTypeMustBeValueObjectImplementor(static::class, $itemClassname);
}

return $itemClassname;
return self::$validItemClassname = $itemClassname;
}

private static function validateItem(ValueObjectInterface $item): void
{
$itemClassname = self::getValidItemClassname();

if (!$item instanceof $itemClassname) {
throw ValueObjectSetException::invalidItemPassed(static::class, $itemClassname, $item);
}
}
}

0 comments on commit 82f77f9

Please sign in to comment.