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

时间:2017-02-28 17:33:43

标签: php symfony jms-serializer

我有一个模型,它使用JMS Serializer来注释它的属性。 在我使用此对象的另一个类中,我想访问注释中的信息。 例如:

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

}

正如您所看到的,该属性以camelcase风格命名,这对我们的编码标准来说是可以的。但是为了将此对象中的信息传递给外部服务,我需要SerializedName。

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

我的想法是这样的:

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

所以“神奇”部分是我需要帮助的地方。

1 个答案:

答案 0 :(得分:0)

我发现了魔法发生的地方: 在类的标题中,您必须添加以下use语句:

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

现在,您可以从另一个类中调用名称,该名称用于序列化,无论您需要什么,都可以使用它。