Я пытаюсь использовать JMSSerializer в качестве автономной библиотеки для сопоставления ответов JSON от API к моим классам моделей, и я сталкиваюсь с некоторыми проблемами.
Исключение из следующего кода приводит к исключению:
<?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); ?>
Вот исключение
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.
У меня есть следующие библиотеки, установленные для проекта через композитор
{ "require": { "jms/serializer": "1.0.*@dev" } }
Есть ли что-то очевидное, что я пропал без вести, потому что я не использую все решение Doctrine 2?
EDIT: моим окончательным решением было создать файл начальной загрузки со следующим содержимым:
<?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' ); ?>
Я столкнулся с той же проблемой и нашел ваш вопрос через Google. К сожалению, вы еще не получили никаких ответов, поэтому мне пришлось копаться в себе. :П
Дело в том, что аннотации Doctrine Annotations, которые использует JMSSerializer Annotations, НЕ используют обычную автозагрузку PHP .
Как загружаются эти аннотации? От взгляда на код вы можете догадаться, что ORM-сопоставление, подтверждение достоверности и полностью соответствующая аннотация могут быть просто загружены с использованием определенных автозагрузчиков PHP. Однако это не так: по причинам обработки ошибок каждая проверка существования класса внутри AnnotationReader устанавливает второй параметр $ autoload класса_exists ($ name, $ autoload) в false. Чтобы безупречно работать, AnnotationReader требует бесшумных автозагрузчиков, которых нет у многих автозагрузчиков. Тихая автозагрузка НЕ является частью спецификации PSR-0 для автозагрузки.
Это означает, что вам необходимо зарегистрировать файл аннотации самостоятельно:
AnnotationRegistry::registerFile( <PROJECT ROOT> . "/vendor/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php");
… или все пространство имен (предпочтительный метод):
AnnotationRegistry::registerAutoloadNamespace( 'JMS\Serializer\Annotation', <PROJECT ROOT> . "/vendor/jms/serializer/src");
Будьте осторожны с дорожкой в registerAutoloadNamespace
. Сначала я попытался зарегистрировать весь путь к аннотациям таким же образом с помощью registerFile
:
<PROJECT ROOT> . "/vendor/jms/serializer/src/JMS/Serializer/Annotation
но это с треском провалилось. : D
Надеюсь, это поможет вам сделать еще один шаг. 🙂
Довольно уверен, что это обеспечивает бесшумную автоматическую загрузку, которая намного удобнее регистрации самих пространств имен.
AnnotationRegistry::registerLoader('class_exists');
@SirArturio имеет верный ответ на эту головоломку для автозагрузки, и я просто хотел добавить прикосновение большей ясности в ответ на @messified или кого-либо еще, пытающегося заставить это работать. Как он красноречиво объяснил, автоматический обработчик PSR-0 в композиторе или SPL не собирается резать его для загрузки этих аннотаций, поскольку они используют автозагрузку Doctrine.
Итак, вот небольшой пример. Всякий раз, когда вы создаете свой объект JMS Serializer, чтобы начать сериализацию, самое время добавить пространство имен аннотаций в автозагрузчик доктрины. Для ясности я не предполагаю IoC и полностью квалифицированных пространств имен (подсказка подсказки, используйте инъекцию зависимостей):
<?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');
Затем в MyProject \ MyClass:
<?php use JMS\Serializer\Annotation as JMS; class MyClass{ /** @JMS\Exclude */ private $something_secret; }
И это должно сократить его, автозагрузка собственного файла аннотации с использованием доктрины вместо композитора.
Проверьте капитализацию аннотаций. У меня была аналогичная проблема при развертывании из среды Windows dev на сервер Ubuntu, которая была вызвана опечаткой в случае моей аннотации. Файлы Windows не чувствительны к регистру, поэтому он работает там, но не работает в Linux.
Вот решение
1.go в php, затем установите композитор php composer-setup.php 2. перейдите в каталог sdk проекта, например
cd / Applications / XAMPP / xamppfiles / htdocs / streetreturn / adn_sdk-php-master
обновить композитор для установки зависимостей php /Users/zakir/composer.phar update
* Примечание: /Users/zakir/composer.phar будет размещаться при установке композитора на шаге 1