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) | Popis | Parametry |
---|---|---|
CallableSerializer | Umožňuje definovat vlastní callback funkci pro serializaci hodnoty. | callable $callback |
DateTimeImmutableSerializer | Převede hodnotu ve formátu Y-m-d H:i:s na \DateTimeImmutable . | |
DateTimeIntervalSerializer | Převede hodnotu ve formátu Y-m-d H:i:s Y-m-d H:i:s na \DateInterval . | |
DateTimeSerializer | Převede hodnotu ve formátu Y-m-d H:i:s na \DateTime . | |
DateTimeZoneSerializer | Převede array{datetime: Y-m-d H:i:s, zone: Zone/Name} na \DateTime s \DateTimeZone . | |
ToManySerializer | Převede pole (klíčů) na ArrayCollection<int, targetEntity> podle $columnKey (Vyhledá záznamy v DB: WHERE $columnKey = $value ). | string: $targetEntity string: $columnKey |
ToOneSerializer | Př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);
}
}