2013-05-28 3 views
2

Я пытаюсь запустить JMSSerializer. Мой простой кодОшибка загрузки аннотации Doctrine

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"}]}" 

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

+0

Возможный дубликат [JMSSerializer stand alone - Аннотации не существует или не могут быть загружены автоматически] (http://stackoverflow.com/questions/14629137/jmsserializer-stand-alone-annotation-does-not-exist- или-не-быть автоматически загружены) –

ответ

12

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

\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

0

Полный пример конфигурации для автономной 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. После этого все работает как ожидалось.

Смежные вопросы