Přeskočit na hlavní obsah

Serializers

Serializéry slouží k transformaci dat těsně před jejich namapováním na entitu a uložením do databáze.

Příklad využití serializérů

Předpokládejme, že chceme vytvořit nového uživatele. Uživatel má tři atributy: email, password a activatedAt. Atribut activatedAt je v entitě reprezentován jako \DateTime, takže jej do tohoto formátu musíme serializovat. Navíc také potřebujeme, aby se atribut password převedl do šifrované podoby.

public function create(WriteBuilder $builder, CollectionRequest $request): WriteBuilder
{
return $builder
->add(new TextField(
key: 'email',
name: 'Email',
rules: [new RequiredRule(), new UniqueRule(User:class, 'email')]
))
->add(new TextField(
key: 'password',
name: 'Heslo',
rules: [new RequiredRule(), new MinRule(6), new MaxRule(32)],
serializers: [
// Převede heslo na šifrovanou podobu
new CallableSerializer(fn($value) =>
(new Passwords(PASSWORD_ARGON2ID))->hash($value)
)
]
))
->add(new TextField(
key: 'activatedAt',
name: 'Aktivován dne',
rules: [new RequiredRule(), new DateRule()],
serializers: [
// Převede hodotu ve formátu Y-m-d na \DateTime
new DateSerializer()
]
))
;
}

Přehled serializérů

Serializer (název třídy)PopisParametry
CallableSerializerUmožňuje definovat vlastní callback funkci pro serializaci hodnoty.callable $callback
DateTimeImmutableSerializerPřevede hodnotu ve formátu Y-m-d H:i:s na \DateTimeImmutable.
DateTimeIntervalSerializerPřevede hodnotu ve formátu Y-m-d H:i:s Y-m-d H:i:s na \DateInterval.
DateTimeSerializerPřevede hodnotu ve formátu Y-m-d H:i:s na \DateTime.
DateTimeZoneSerializerPřevede array{datetime: Y-m-d H:i:s, zone: Zone/Name}
na \DateTime s \DateTimeZone.
ToManySerializerPřevede pole (klíčů) na ArrayCollection<int, targetEntity> podle $columnKey
(Vyhledá záznamy v DB: WHERE $columnKey = $value).
string: $targetEntity
string: $columnKey
ToOneSerializerPřevede hodnotu (klíč) na targetEntity podle $columnKey
(Vyhledá záznamy v DB: WHERE $columnKey = $value).
string: $targetEntity
string: $columnKey

Vlastní serializér

Pokud pořebujete ovlivnit serializaci nějakých hodnot jiným způsobem než nabízí výše uvedené serializéry, můžete si vytvořit vlastní serializér.

Vytvoření serializéru

Stačí přidat novou třídu, která podědí BaseSerializer a implementuje metodu serialize().

app/Collection/Serializer/MyCustomSerializer.php
class MyCustomSerializer extends BaseSerializer
{
/**
* @param class-string $targetEntity
*/
public function __construct(
protected string $targetEntity,
protected string $columnKey = 'id',
)
{
}

public function serialize(IField $field): mixed
{
$value = $field->getValue();

if ($value === null) {
return null;
}

if (!is_array($value)) {
throw new SerializerException(
"Invalid MyCustom serializer value in field '{$field->getName()}'"
);
}

$em = $this->getBuilder()->getEntityManager();

$rows = $em
->getRepository($this->targetEntity)
->findBy([$this->columnKey => $value]);

return new ArrayCollection($rows);
}
}