jms_serializer deserialize php jmsserializerbundle

php - deserialize - JMSSerializer independiente: la anotación no existe o no se puede cargar automáticamente



symfony json deserialize (5)

Estoy intentando utilizar JMSSerializer como una biblioteca independiente para asignar respuestas JSON de una API a mis clases de modelo y estoy teniendo problemas.

Ejecutar los siguientes resultados de código en una excepción:

<?php require dirname(__DIR__) . ''/vendor/autoload.php''; use JMS/Serializer/Annotation AS JMS; class Trii { /** * User ID for this session * @JMS/SerializedName("userID") * @JMS/Annotation(getter="getUserId") * @JMS/Type("string") * @var string */ private $userId; public function getUserId() { return $this->userId; } public function setUserId($userId) { $this->userId = $userId; } } $serializer = /JMS/Serializer/SerializerBuilder::create()->setDebug(true)->build(); $object = $serializer->deserialize(''{"userID":"Trii"}'', ''Trii'', ''json''); var_dump($object); ?>

Aquí está la excepción

Doctrine/Common/Annotations/AnnotationException: [Semantical Error] The annotation "@JMS/Serializer/Annotation/SerializedName" in property Trii::$userId does not exist, or could not be auto-loaded.

Tengo las siguientes bibliotecas instaladas para el proyecto a través de compositor

{ "require": { "jms/serializer": "1.0.*@dev" } }

¿Hay algo obvio que me falta, ya que no estoy usando toda la solución de Doctrine 2?

EDIT: mi solución final fue crear un archivo bootstrap con el siguiente contenido:

<?php // standard composer install vendor autoload magic require dirname(__DIR__) . ''/vendor/autoload.php''; // Bootstrap the JMS custom annotations for Object to Json mapping /Doctrine/Common/Annotations/AnnotationRegistry::registerAutoloadNamespace( ''JMS/Serializer/Annotation'', dirname(__DIR__).''/vendor/jms/serializer/src'' ); ?>


@SirArturio tiene la respuesta correcta a este acertijo de autocargador, y solo quería agregar un toque más de claridad en respuesta a @messified o cualquier otra persona que esté luchando para que esto funcione. Como explicó elocuentemente, el controlador PSR-0 automático en el compositor, o SPL, no va a cortarlo para cargar estas anotaciones ya que usan la carga automática de Doctrine.

Así que aquí hay un pequeño ejemplo completo. Siempre que cree su objeto Serializador JMS para comenzar la serialización, es un buen momento para agregar el espacio de nombres de anotación al autocargador de Doctrine. Para mayor claridad, asumo que no hay IoC, y espacio de nombres totalmente calificado (sugerencia de pista, uso de inyección de dependencia):

<?php Doctrine/Common/Annotations/AnnotationRegistry::registerAutoloadNamespace( ''JMS/Serializer/Annotation'', $your_app_basepath . "/vendor/jms/serializer/src"); $serializer = JMS/Serializer/SerializerBuilder::create()->build(); $json_output = $serializer->serialize(''MyProject/MyClass'', ''json'');

Luego en su MyProject / MyClass:

<?php use JMS/Serializer/Annotation as JMS; class MyClass{ /** @JMS/Exclude */ private $something_secret; }

Y eso debería cortarlo, cargando automáticamente el archivo de anotación adecuado usando doctrina en lugar de compositor.


Aquí está la solución

1. Ir al directorio php y luego instalar el compositor php composer-setup.php 2. ir al directorio del proyecto sdk, por ejemplo

cd / Aplicaciones / XAMPP / xamppfiles / htdocs / streetreturn / adn_sdk-php-master

actualizar compositor para instalar las dependencias php /Users/zakir/composer.phar actualización

* Nota: /Users/zakir/composer.phar se ubicará cuando instale el compositor en el paso 1


Bastante seguro de que esto permite la carga automática silenciosa, que es mucho más conveniente que registrar los espacios de nombres usted mismo.

AnnotationRegistry::registerLoader(''class_exists'');


Compruebe la capitalización de sus anotaciones. Tuve un problema similar al implementar desde un entorno de desarrollo de Windows a un servidor de Ubuntu que fue causado por un error tipográfico en el caso de mi anotación. Los archivos de Windows no distinguen entre mayúsculas y minúsculas, por lo que funcionan allí pero fallan en Linux.


Me encontré con el mismo problema y encontré tu pregunta a través de Google. Desafortunadamente todavía no has recibido ninguna respuesta, así que tuve que excavar en mí mismo. :PAG

El caso es que Doctrine Annotations, que utiliza JMSSerializer Annotations, NO utiliza la carga automática PHP normal .

¿Cómo se cargan estas anotaciones? Al mirar el código, puede adivinar que la Correlación de ORM, la Validación de Aserción y la anotación totalmente calificada solo pueden cargarse utilizando los autocargadores de PHP definidos. Sin embargo, este no es el caso: por motivos de manejo de errores, cada comprobación de existencia de clases dentro de AnnotationReader establece el segundo parámetro $ autoload of class_exists ($ name, $ autoload) en false. Para funcionar sin problemas, el AnnotationReader requiere cargadores automáticos silenciosos que muchos cargadores automáticos no tienen. La carga automática silenciosa NO es parte de la especificación PSR-0 para carga automática.

Esto significa que tiene que registrar los archivos de Anotación usted mismo:

AnnotationRegistry::registerFile( <PROJECT ROOT> . "/vendor/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php");

... o todo el espacio de nombres (método preferido):

AnnotationRegistry::registerAutoloadNamespace( ''JMS/Serializer/Annotation'', <PROJECT ROOT> . "/vendor/jms/serializer/src");

Tenga cuidado con la ruta en registerAutoloadNamespace . Primero traté de registrar todo el camino a las anotaciones de la misma manera con registerFile :

<PROJECT ROOT> . "/vendor/jms/serializer/src/JMS/Serializer/Annotation

pero eso falló miserablemente. :RE

Espero que esto te lleve un paso más allá. :)