AbstractReflection v1.0.1
Базовый класс 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) |
Возвращает: static — гидратированный экземпляр
Исключения:
- ValidationException — ошибки обязательных путей
toArray(): array
Описание: Экспорт инициализированных public non-static свойств. Вложенные AbstractReflection раскрываются рекурсивно.
Возвращает: array
toJson(): string
Описание: Pretty-printed JSON из toArray() с JSON_THROW_ON_ERROR, JSON_UNESCAPED_UNICODE, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_INVALID_UTF8_SUBSTITUTE.
Возвращает: string
Исключения:
JsonException
static setLogger(LoggerInterface $logger): void
Описание: Переопределяет PSR-3 логгер, используемый при сбоях валидации (по умолчанию Analog\Logger).
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
$logger | LoggerInterface | PSR-3 логгер |
Возвращает: void
static resetLogger(): void
Описание: Сбрасывает кастомный логгер (удобно в teardown тестов).
Возвращает: void
Пример:
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