Подтвердить что ты не робот

JMSSerializer отдельно - аннотация не существует или не может быть загружена автоматически

Я пытаюсь использовать 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'
);
?>
4b9b3361

Ответ 1

Я столкнулся с той же проблемой и нашел ваш вопрос через Google. К сожалению, вы еще не получили никаких ответов, поэтому мне пришлось копаться в себе.: P

Дело в том, что аннотации доктрины, которые используются 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

Надеюсь, это поможет вам сделать еще один шаг.:)

Ответ 2

Довольно уверен, что это обеспечивает бесшумную автоматическую загрузку, что намного удобнее, чем самостоятельно регистрировать пространства имен.

AnnotationRegistry::registerLoader('class_exists');

Ответ 3

@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;
}

И это должно разрезать его, автозагружая собственный файл аннотации, используя доктрину вместо композитора.

Ответ 4

Проверьте капитализацию аннотаций. У меня была аналогичная проблема при развертывании из среды Windows dev на сервер Ubuntu, которая была вызвана опечаткой в ​​случае моей аннотации. Файлы Windows не чувствительны к регистру, поэтому он работает там, но не работает в Linux.

Ответ 5

Вот решение

1.go в папку php, затем установите композитор php composer-setup.php 2. Перейдите в каталог проекта sdk например

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

обновить композитор для установки зависимостей Обновление php/Users/zakir/composer.phar

* Примечание:/Users/zakir/composer.phar будет находиться при установке композитора на шаге 1