Symfony 6.4 viene cargado de novedades: More Built-in Message Handlers, FQCN-based Routes, CHIPS Cookies; por mencionar algunas de ellas. En este caso vamos a hablar de otra de ellas que son las mejoras en el serializador. Esto es muy útil a la hora de elegir qué queremos mostrar de nuestras entidades según la ocasión.
Atributos de Grupo basados en Clases
Los grupos de serialización permiten serializar diferentes conjuntos de atributos de tus entidades según tus necesidades. Un nombre de grupo es una cadena arbitraria que asocia una propiedad a uno o más de esos conjuntos de serialización.
En Symfony 6.4 estamos mejorando los grupos de serialización para que también puedas definirlos a nivel de clase. Esto asociará todas las propiedades a ese grupo, además de los grupos a los que opcionalmente cada propiedad se asocie:
#[ORM\Entity]
#[Groups(['show_product'])]
class Product
{
// ...
#[ORM\Column(type: 'string', length: 255)]
#[Groups(['list_product'])]
private string $name;
#[ORM\Column(type: 'text')]
private string $description;
}
En este ejemplo, la propiedad name
pertenece a los grupos show_product
y list_product
, pero la propiedad description
solo pertenece al grupo show_product
.
Normalizador de Objetos Traducibles
En Symfony 5.2 introdujimos los objetos traducibles, que son objetos que contienen toda la información necesaria para traducir su propio contenido, como los parámetros de traducción y el dominio de traducción.
En Symfony 6.4, estamos introduciendo un normalizador de objetos traducibles, que traduce el contenido de estos objetos a la configuración regional definida en la opción NORMALIZATION_LOCALE_KEY
al serializar objetos. No hay que hacer nada para usar este nuevo normalizador. Actualiza tu aplicación a Symfony 6.4 o superior y esto funcionará de forma automática.
Proveedor de Grupos de Validación Fuera de los DTO
Actualmente, puedes determinar la secuencia de grupos a aplicar dinámicamente en función del estado de tu DTO implementando la interfaz GroupSequenceProviderInterface
en tu clase de DTO:
use Symfony\Component\Validator\GroupSequenceProviderInterface;
#[Assert\GroupSequenceProvider]
class UserDto implements GroupSequenceProviderInterface
{
// ...
public function getGroupSequence(): array|GroupSequence
{
if ($this->isCompanyType()) {
return ['User', 'Company'];
}
return ['User'];
}
}
Sin embargo, en casos más avanzados, es posible que necesites utilizar un servicio para definir esa secuencia de grupos. Una posible solución sería inyectar el servicio en el constructor del DTO, pero eso suele estar fuera del alcance de la responsabilidad del DTO (y, estrictamente hablando, podría no ajustarse a los principios SOLID).
En Symfony 6.4 estamos mejorando esto al permitirte crear una clase que implemente la interfaz GroupProviderInterface
y luego usarla en tu DTO mediante el atributo GroupSequenceProvider
:
use Symfony\Component\Validator\Constraints as Assert;
#[Assert\GroupSequenceProvider(provider: UserGroupProvider::class)]
class UserDto
{
// ...
}
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\GroupProviderInterface;
class UserGroupProvider implements GroupProviderInterface
{
public __constructor(private readonly ConfigService $config)
{
}
public function getGroups(object $object): array|GroupSequence
{
if ($this->config->isEnabled()) {
return ['User', $this->config->getGroup()];
}
return ['User'];
}
}