访问 Annotation 定义的对象 属性 的 SerializedName

Access the SerializedName of a object property defined by Annotation

我有一个模型,它使用 JMS 序列化程序为其属性添加注解。 在我使用此对象的另一个 class 中,我想访问注释中的信息。 示例:

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

}

如您所见,属性 以驼峰式命名,这符合我们的编码标准。但是为了将此对象中的信息传递给外部服务,我需要 SerializedName。

所以我的想法是在这个 class 中编写一个方法,它为每个 属性 提供来自 Annotation 的 SerializedName。是否可以通过方法访问注释中的信息?如果是怎么办?

我的想法是这样的:

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

所以 "magic" 部分是我需要帮助的地方。

我发现了魔法发生的地方: 在 class 的 header 中,您必须添加以下使用语句:

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

现在您可以从另一个 class 调用用于序列化的名称,并根据需要使用它。