访问 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 调用用于序列化的名称,并根据需要使用它。
我有一个模型,它使用 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 调用用于序列化的名称,并根据需要使用它。