es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Serialización de campos anidados en Symfony

¿Es posible lograr esto usando el serializador Symfony o JMS?

Mi esquema de ejemplo:

    class User
    {
        /**
         * @ORM\Column(type="string")
         * @Serializer\Groups({
         *     "name"
         * })
         * @Serializer\Expose()
        */
        private $name;       

    /**
     * @ORM\Column(type="string")
     * @Serializer\Groups({
     *     "age"
     * })
     * @Serializer\Expose()
    */
    private $age;   

    /**
     * @ORM\ManyToOne(targetEntity="Product")
     * @Serializer\Groups({
     *     "product"
     * })
     * @Serializer\Expose()
    */
    private $product;   
}

class Product
{
    /**
     * @ORM\Column(type="string")
     * @Serializer\Groups({
     *     "name"
     * })
     * @Serializer\Expose()
    */
    private $name;
}


Ahora me gustaría pasar los siguientes grupos de serialización para que el serializador devuelva exactamente ese esquema:

php
$groups = [
‘age’,
‘product’ => [‘name’]
];
$serializer->serialize($user, ‘json’, (new SerializationContext())->setGroups($groups));

y esto debería devolverme solo

json
{
“age”: 15,
“product”: {
“name”: “Product 1”
}
}

Sin embargo, esto no funciona porque devuelve solo:

json
{
“age”: 15
}

Después de ajustar un poco:

php
$groups = [
0 => ‘age’,
1 => ‘product’,
‘product’ => [‘name’]
];

devuelve:

json
{
“age”: 15,
“product”: {}
}

pero “product” todavía no tiene nombre, desafortunadamente.

Comienza a funcionar cuando agrego “name” a la raíz del array, así:

php
$groups = [
0 => ‘age’,
1 => ‘name’,
2 => ‘product’
];

devuelve:

json
{
“name”: “Juan”,
“age”: 15,
“product”: {
“name”: “Product 1”
}
}

Sin embargo, esto no es lo que quiero porque el usuario también devuelve “nombre”.

Quiero devolver exactamente esas propiedades que he especificado, como lo admite GraphQL para los campos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible lograr esto utilizando el serializador Symfony o el serializador JMS. Ambos serializadores admiten el concepto de grupos de serialización, que le permiten especificar qué campos deben incluirse en la salida serializada. También puede especificar grupos de serialización anidados, lo que le permitirá incluir objetos anidados en la salida serializada.

Comments are closed.