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.

API Platform: “Valor no esperado de tipo no objeto para propiedad de objeto.”

Estoy intentando usar la serialización de API Platform con un campo calculado como se muestra aquí https://api-platform.com/docs/core/serialization/#calculated-field

Aquí está el código

/**
 * @Groups({
 *     "read:actionJeu"
 * })
 */
public function getTimePassed(){
    return 4;
}

El contexto de normalización es normalizationContext={"groups"={"read:actionJeu"}, "enable_max_depth"=true}

El problema es que cuando hago return 4, muestra este errorenter image description here

Pero cuando cambio el retorno a algo diferente (por ejemplo, return new \DateTime('now') ), funciona.

Me pregunto por qué está sucediendo esto, también lo intenté con una cadena, pero no funciona.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según la documentación de la Plataforma de API sobre campos calculados, se sugiere devolver un objeto en lugar de un valor escalar para los campos calculados. Esto se debe a que API Platform utiliza el componente Symfony Serializer, que no admite la serialización de valores escalares directamente.

    Por lo tanto, en el ejemplo de código proporcionado, cuando se devuelve el valor entero 4, el serializador genera un error porque no puede serializarlo. Sin embargo, cuando se devuelve un objeto DateTime que se puede serializar, funciona correctamente.

    Para resolver este problema, puedes crear un objeto de valor o una clase DTO (Objeto de Transferencia de Datos) que envuelva el valor escalar calculado en un objeto y devuelva ese objeto en su lugar. De esta manera, el serializador puede manejar el objeto y serializarlo correctamente.

    Por ejemplo,

    class TiempoTranscurrido
    {
        private $valor;
    
        public function __construct(int $valor)
        {
            $this->valor = $valor;
        }
    
        public function getValor(): int
        {
            return $this->valor;
        }
    }
    
    /**
     * @Groups({"read:actionJeu"})
     */
    public function getTiempoTranscurrido(): TiempoTranscurrido
    {
        return new TiempoTranscurrido(4);
    }
    

    En el ejemplo de código anterior, hemos creado una clase TiempoTranscurrido que envuelve el valor escalar calculado 4 en un objeto. Luego, devolvemos este objeto desde el método getTiempoTranscurrido. Ahora, el serializador puede serializar este objeto y devolver la respuesta correcta.

Comments are closed.