Гидратация
Как строки базы данных преобразуются в PHP-объекты.
Содержание
Обзор
Гидратация — это процесс преобразования необработанных строк БД (ассоциативных массивов) в типизированные PHP DTO-объекты. Rowcast по умолчанию использует Reflection-гидратор, который выполняет это автоматически.
ReflectionHydrator (по умолчанию)
Встроенный ReflectionHydrator:
- Создаёт новый экземпляр DTO-класса без вызова конструктора
- Маппит каждое значение колонки в соответствующее свойство
- Приводит значения к объявленным PHP-типам через
TypeCasterRegistry - Устанавливает значения свойств через Reflection
use AsceticSoft\Rowcast\Hydration\ReflectionHydrator;
$hydrator = new ReflectionHydrator();
// Гидратация одной строки
$user = $hydrator->hydrate(User::class, [
'id' => 1,
'name' => 'Alice',
'email' => 'alice@example.com',
]);
// Гидратация нескольких строк
$users = $hydrator->hydrateAll(User::class, $rows);
Пользовательский реестр TypeCaster
use AsceticSoft\Rowcast\TypeCaster\TypeCasterRegistry;
$registry = TypeCasterRegistry::createDefault();
$registry->addCaster(new UuidTypeCaster());
$hydrator = new ReflectionHydrator(typeCaster: $registry);
Пользовательский гидратор
Реализуйте HydratorInterface для настройки преобразования строк в объекты:
use AsceticSoft\Rowcast\Hydration\HydratorInterface;
use AsceticSoft\Rowcast\Mapping\ResultSetMapping;
class MyHydrator implements HydratorInterface
{
public function hydrate(
string $className,
array $row,
?ResultSetMapping $rsm = null,
): object {
// ваша логика
}
public function hydrateAll(
string $className,
array $rows,
?ResultSetMapping $rsm = null,
): array {
return array_map(
fn(array $row) => $this->hydrate($className, $row, $rsm),
$rows,
);
}
}
Использование пользовательского гидратора
$mapper = new DataMapper($connection, hydrator: new MyHydrator());
HydratorInterface
interface HydratorInterface
{
/**
* Гидратировать одну строку в объект.
*/
public function hydrate(
string $className,
array $row,
?ResultSetMapping $rsm = null,
): object;
/**
* Гидратировать несколько строк в массив объектов.
*/
public function hydrateAll(
string $className,
array $rows,
?ResultSetMapping $rsm = null,
): array;
}
Пользовательский гидратор полезен, когда требуется инициализация через конструктор, валидация или интеграция с конкретным фреймворком.