- Added ArrayOf attributes and DatasetFill/DatasetPull events. ArrayCollection is also working with ArrayOf attributes

This commit is contained in:
mcndave committed 2026-04-13 17:00:29 +00:00
1 parent fd5d31fa17
commit 009e30eb7e
21 files changed
+322 -43

No files matched your search

+72
View File
@@ -0,0 +1,72 @@
<?php
namespace Ulmus\Attribute\Property;
use Notes\Common\ReflectedProperty;
use Ulmus\Entity\EntityInterface;
use Ulmus\Entity\JsonUnserializable;
#[\Attribute(\Attribute::TARGET_PROPERTY)]
class ArrayOf implements \Ulmus\Entity\EntityValueModifier
{
public function __construct(
protected string $type,
) {}
public function push(mixed $value, ReflectedProperty $property): mixed
{
$return = [];
foreach($value as $index => $item) {
if (! is_object($item)) {
if (enum_exists($this->type)) {
if ($this->type::tryFrom($item) === null) {
throw new \InvalidArgumentException(
sprintf("Given item '%s' is not a valid enum for type %s ; try one of theses instead : %s", $item, $this->type, implode("', '", array_map(fn($e) => $e->value, $this->type::cases())))
);
} else {
$value = $this->type::from($item);
}
}
elseif (class_exists($this->type)) {
if (is_subclass_of($this->type, JsonUnserializable::class)) {
$value = (new \ReflectionClass($this->type))->newInstanceWithoutConstructor();
$value->jsonUnserialize($item);
}
else {
$value = new $this->type($item);
}
}
$return[$index] = $value;
}
}
if (! $property->type->builtIn) {
$cls = $property->type->type;
return new $cls($return);
}
return $return;
}
public function pull(mixed $value, ReflectedProperty $property) : mixed
{
$return = [];
foreach($value as $index => $item) {
if (is_object($item)) {
if (enum_exists($this->type)) {
$value = $item->value;
} elseif (class_exists($this->type)) {
$value = (string) $value;
}
$return[$index] = $value;
}
}
return $return;
}
}