Приведение типов
Автоматическая конвертация между PHP-типами и значениями базы данных.
Содержание
Обзор
Rowcast автоматически приводит значения БД к PHP-типам, объявленным в свойствах DTO, и конвертирует PHP-значения обратно в форматы, совместимые с базой данных, при записи.
Чтение (БД → PHP)
| Значение в БД | Тип PHP-свойства | Результат |
|---|---|---|
"42" |
int |
42 |
"3.14" |
float |
3.14 |
"1" / "0" |
bool |
true / false |
42 |
string |
"42" |
"2025-06-15 10:30:00" |
DateTimeImmutable |
объект DateTimeImmutable |
"2025-06-15 10:30:00" |
DateTimeInterface |
объект DateTimeImmutable |
"2025-06-15 10:30:00" |
DateTime |
объект DateTime |
"active" |
UserStatus (BackedEnum) |
UserStatus::Active |
NULL |
?int, ?string и т.д. |
null |
Запись (PHP → БД)
| PHP-значение | Значение в БД |
|---|---|
true / false |
1 / 0 |
DateTimeInterface |
строка "Y-m-d H:i:s" |
BackedEnum |
Базовое значение (int/string) |
null |
NULL |
| Скаляры | Передаются как есть |
Встроенные кастеры типов
ScalarTypeCaster
Обрабатывает конвертацию int, float, bool и string:
// БД "42" → PHP int 42
// БД "3.14" → PHP float 3.14
// БД "1" → PHP bool true
// БД 42 → PHP string "42"
DateTimeTypeCaster
Обрабатывает DateTime, DateTimeImmutable и DateTimeInterface:
class Post
{
public int $id;
public string $title;
public DateTimeImmutable $createdAt;
public DateTime $updatedAt;
}
// Чтение: "2025-06-15 10:30:00" → объект DateTimeImmutable
// Запись: DateTimeImmutable → "2025-06-15 10:30:00"
Когда тип свойства — DateTimeInterface, значение всегда преобразуется в DateTimeImmutable.
EnumTypeCaster
Обрабатывает любой BackedEnum:
enum Status: string
{
case Active = 'active';
case Inactive = 'inactive';
case Banned = 'banned';
}
class UserDto
{
public int $id;
public Status $status;
public ?Status $previousStatus; // nullable enum поддерживается
}
// Чтение: "active" → Status::Active
// Запись: Status::Active → "active"
Пользовательский кастер типов
Реализуйте TypeCasterInterface для поддержки дополнительных типов:
use AsceticSoft\Rowcast\TypeCaster\TypeCasterInterface;
class UuidTypeCaster implements TypeCasterInterface
{
public function supports(string $type): bool
{
return $type === Uuid::class;
}
public function cast(mixed $value, string $type): Uuid
{
return new Uuid((string) $value);
}
}
Регистрация пользовательского кастера
use AsceticSoft\Rowcast\TypeCaster\TypeCasterRegistry;
$registry = TypeCasterRegistry::createDefault();
$registry->addCaster(new UuidTypeCaster());
Использование пользовательского реестра
Передайте пользовательский гидратор с реестром в DataMapper:
use AsceticSoft\Rowcast\Hydration\ReflectionHydrator;
use AsceticSoft\Rowcast\DataMapper;
$hydrator = new ReflectionHydrator(typeCaster: $registry);
$mapper = new DataMapper($connection, hydrator: $hydrator);
Метод TypeCasterRegistry::createDefault() возвращает реестр со всеми встроенными кастерами. Используйте addCaster() для добавления своих.