2017-02-28 60 views
1

我有一个模型,它使用JMS序列化器对其属性进行注释。 在另一个使用此对象的类中,我想访问注释中的信息。 例子:访问由注释定义的对象属性的序列化名称

class ExampleObject 
{ 
    /** 
    * @var int The status code of a report 
    * 
    * @JMS\Expose 
    * @JMS\Type("integer") 
    * @JMS\SerializedName("StatusCode") 
    * @Accessor(getter="getStatusCode") 
    */ 
    public $statusCode; 

} 

正如你所看到的属性是首字母大写的风格,这是确定我们的编码标准命名。但为了将此对象中的信息传递给外部服务,我需要SerializedName。

所以我的想法是在这个类中编写一个方法,该方法为每个属性提供了从注释返回的SerializedName。是否可以通过方法访问注释中的信息?如果是的话如何?

我的想法是这样的:

public function getSerializerName($propertyName) 
{ 
    $this->$propertyName; 
    // Do some magic here with the annotation info 
    return $serializedName; 
} 

所以“神奇”的部分是,我需要一些帮助。

回答

0

我发现那里的神奇正在发生的事情: 在类的头,你必须添加以下使用语句:

use Doctrine\Common\Annotations\AnnotationReader; 
use Doctrine\Common\Annotations\DocParser; 

得到SerializedName工作的方法如下:

/** 
* Returns the name from the Annotations used by the serializer. 
* 
* @param $propertyName property whose Annotation is requested 
* 
* @return mixed 
*/ 
public function getSerializerName($propertyName) 
{ 
    $reader = new AnnotationReader((new DocParser())); 
    $reflection = new \ReflectionProperty($this, $propertyName); 
    $serializedName = $reader->getPropertyAnnotation($reflection, 'JMS\Serializer\Annotation\SerializedName'); 

    return $serializedName->name; 
} 

现在,您可以从另一个类调用该名称,该名称用于序列化并使用它来处理任何您需要的名称。

相关问题