Загрузчик аннотаций Doctrine не работает

Я пытаюсь запустить JMSSerializer. Мой простой код

use JMS\Serializer\Annotation\Type;

class Comment
{
    private $msg;

    public function __construct($msg)
    {
        $this->msg = $msg;
    }
}

class Person
{
    /**
     * @Type("array<Comment>")
     */
    private $commentList;

    public function addComment(Comment $comment)
    {
        $this->commentList[] = $comment;
    }
}

$type = new Type;
$serializer = JMS\Serializer\SerializerBuilder::create()->build();

$data = new Person();
$data->addComment(new Comment('hey'));

var_dump($serializer->serialize($data, 'json'));

терпит неудачу с

PHP Fatal error:  Uncaught exception 'Doctrine\Common\Annotations\AnnotationException' with message '[Semantical Error] The annotation "@JMS\Serializer\Annotation\Type" in property Person::$commentList does not exist, or could not be auto-loaded.' in xxx.php:52

Хорошо, но если я добавлю строку

$type = new Type;

чтобы запустить автозагрузчик вручную, он работает:

string(32) "{"comment_list":[{"msg":"hey"}]}"

Как я вижу, AnnotationRegistry не использует автозагрузчик, он пытается использовать какой-то собственный автозагрузчик. Это выглядит некрасиво, что мне нужно сделать, чтобы это исправить?


person Misanthrope    schedule 28.05.2013    source источник


Ответы (2)


Хорошо, я сам отвечаю на свой вопрос. Я должен зарегистрировать аннотации где-то в файле автозагрузчика:

\Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace(
    'JMS\Serializer\Annotation', __DIR__.'/vendor/jms/serializer/src'
);

Другие способы: http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html#registering-annotations

person Misanthrope    schedule 28.05.2013

Пример полной конфигурации для автономной библиотеки сериализатора JMS может быть следующим:

<?php
namespace iMSCP\Service;
use JMS\Serializer\Serializer;
use JMS\Serializer\SerializerBuilder;
use Doctrine\Common\Annotations\AnnotationRegistry;
use iMSCP_Registry as Registry;

/**
 * Class SerializerServiceFactory
 * @package iMSCP\Service
 */
class SerializerServiceFactory
{
    /**
     * @var Serializer
     */
    static $serialiszer;

    public static function create()
    {
        if (static::$serialiszer === null) {
            $config = Registry::get('config');
            AnnotationRegistry::registerAutoloadNamespace(
                'JMS\Serializer\Annotation', $config['CACHE_DATA_DIR'] . '/packages/vendor/jms/serializer/src'
            );
            static::$serialiszer = SerializerBuilder::create()
                ->setCacheDir(CACHE_PATH . '/serializer')
                ->setDebug($config['DEVMODE'])
                ->build();
        }

        return static::$serialiszer;
    }
}

Здесь я регистрирую пространство имен JMS\Serializer\Annotation, используя реестр аннотаций, предоставленный Doctrine. После этого все работает, как и ожидалось.

person Nuxwin    schedule 11.10.2015