AbstractReflection v1.0.0
Базовый класс DTO: fromArray, toArray, toJson через ReflectionMapper.
Описание: Абстрактный базовый класс для DTO с public typed свойствами. Реализует ReflectionInterface. Гидратацию и сериализацию делегирует ReflectionMapper.
Namespace: Devcraft\Abstracts
Implements: ReflectionInterface
С версии: 1.0.0
См. также:
static fromArray(array $data): static
Описание: Создаёт экземпляр через new static() и гидратирует public-свойства через ReflectionMapper::hydrate().
Параметры:
$data(array): ассоциативный массив (например decoded JSON)
Исключения: ValidationException при ошибках обязательных путей.
toArray(): array
Описание: Экспорт инициализированных public non-static свойств. Вложенные AbstractReflection раскрываются рекурсивно.
toJson(): string
Описание: Pretty-printed JSON из toArray() с JSON_THROW_ON_ERROR, JSON_UNESCAPED_UNICODE, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_INVALID_UTF8_SUBSTITUTE.
Исключения: JsonException
static setLogger(LoggerInterface $logger): void
Описание: Переопределяет PSR-3 логгер, используемый при сбоях валидации (по умолчанию Analog\Logger).
static resetLogger(): void
Описание: Сбрасывает кастомный логгер (удобно в teardown тестов).
Пример:
use Devcraft\Abstracts\AbstractReflection;
use Devcraft\Attributes\ArrayOf;
use Devcraft\Attributes\Range;
use Devcraft\Attributes\Regex;
final class Address extends AbstractReflection
{
public string $city;
}
final class Proxy extends AbstractReflection
{
#[Regex('/^[0-9a-f-]{36}$/i')]
public string $id;
#[Range(min: 1, max: 65535)]
public int $port;
public Address $address;
#[ArrayOf(Address::class)]
public array $locations = [];
}
$proxy = Proxy::fromArray([
'id' => '550e8400-e29b-41d4-a716-446655440000',
'port' => '8080',
'address' => ['city' => 'Berlin'],
'locations' => [
['city' => 'Berlin'],
['city' => 'Paris'],
],
]);
$proxy->port; // int 8080 (string coerced)
$proxy->address->city; // 'Berlin'
$proxy->toArray(); // nested arrays
echo $proxy->toJson(); // pretty-printed JSON