2013-05-28 38 views
2

我想运行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 

OK,但如果我添加行

$type = new Type; 

手动触发自动加载磁带机,它的工作原理:

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

正如我请参阅AnnotationRegistry不使用自动加载器,它三es使用一些自己的自动加载器。它看起来很丑陋,我需要做些什么来修复它?

+0

可能重复[JMSSerializer独立 - 注释不存在,或不能自动加载](http://stackoverflow.com/questions/14629137/jmsserializer-stand-alone-annotation-does-not-exist-或者,不能待自动加载) –

回答

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提供的Annotation注册表。完成后,所有工作都按预期工作。