JMSSerializer autonome - Annotation n'existe pas ou ne peut pas être chargé automatiquement
Je suis d'essayer d'utiliser JMSSerializer comme un stand alone de la bibliothèque à la carte des réponses JSON à partir d'une API pour mes classes de modèle et je suis en cours d'exécution dans certaines questions.
L'exécution du code suivant génère une exception:
<?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);
?>
Ici est l'exception
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.
J'ai les bibliothèques suivantes installé pour le projet via composer
{
"require": {
"jms/serializer": "1.0.*@dev"
}
}
Est là quelque chose d'évident, je suis absent depuis que je ne suis pas à l'aide de l'ensemble de la Doctrine 2 solution?
EDIT: ma solution finale a été de créer un fichier de bootstrap avec le contenu suivant:
<?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'
);
?>
Vous devez vous connecter pour publier un commentaire.
Assez sûr que cette mesure de silencieux de chargement automatique qui est beaucoup plus pratique que l'inscription à des espaces de noms vous-même.
use Doctrine\Common\Annotations\AnnotationRegistry;
ligne si vous allez utiliser la forme courte pour cela. J'ai mis cela dans mon application bootrapper (/app/boostrap/app.php
), même si elle peut aller dans l'autochargeur (/app/boostrap/autoload.php
) ainsi tant qu'elle suit le compositeur de chargement automatique.Doctrine\Common\Annotations\AnnotationRegistry::registerLoader('class_exists');
dansbootstrap/app.php
de mon Laravel Lumen projet a fonctionné!J'ai rencontré le même problème et trouvé votre question par le biais de Google. Malheureusement vous n'avez pas encore reçu toutes les réponses, donc j'ai dû creuser en moi. 😛
La chose est, la Doctrine des Annotations, qui JMSSerializer Annotations utilise, ne PAS utiliser de PHP normal que le chargement automatique.
Cela signifie que vous devez enregistrer le fichier d'Annotation(s) de vous-même:
... ou l'ensemble de l'espace de noms (méthode préférée):
Être prudent avec le chemin d'accès dans
registerAutoloadNamespace
. J'ai d'abord essayé d'enregistrer le chemin d'accès complet pour les annotations de la même façon avecregisterFile
:mais qui a échoué lamentablement. 😀
J'espère que cela vous arrive un pas de plus. 🙂
@SirArturio a la réponse correcte à ce que le Chargement automatique de puzzle, et je voulais juste ajouter une touche plus de clarté dans la réponse à @messified ou quelqu'un d'autre de la difficulté à obtenir ce travail. Comme il l'a si bien expliqué, l'automatique PSR-0 gestionnaire de compositeur, ou SPL ne va pas le couper pour le chargement de ces annotations, car ils utilisent la Doctrine de l'autochargement.
Voici donc petit exemple complet. Chaque fois que vous créez votre JMS Sérialiseur objet pour commencer, la sérialisation est un bon moment pour ajouter l'annotation de l'espace de noms à la doctrine de l'autochargeur. Pour plus de clarté, je suis en supposant qu'aucun Cio, et pleinement qualifié espaces de noms (hint hint, utiliser l'injection de dépendance):
Puis dans votre Monprojet\Maclasse:
Et qui doit le couper, le chargement automatique le bon fichier d'annotation à l'aide de la doctrine à la place de compositeur.
Vérifier la capitalisation de vos annotations. J'ai eu un problème similaire lors du déploiement de Windows environnement de dev pour un serveur Ubuntu qui a été causé par une faute de frappe dans le cas de mon annotation. Les fichiers de Windows sont insensibles à la casse, donc ça fonctionne, mais échoue sur Linux.
Si vous utilisez Composer, vous pouvez obtenir loader en spécifiant un chemin dans le besoin:
Voici la solution
1.aller au répertoire php puis installer compositeur
php composer-setup.php
2. aller à projet de répertoire du sdk
par exemple,
cd /Applications/XAMPP/xamppfiles/htdocs/streetreturn/adn_sdk-php-master
mise à jour de compositeur pour installer les dépendances
php /Utilisateurs/zakir/compositeur.phar update
*Note: /Users/zakir/compositeur.phar sera situé lors de l'installation du compositeur à l'étape 1