我有一个模型,它使用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;
}
所以“神奇”部分是我需要帮助的地方。
答案 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;
}
现在,您可以从另一个类中调用名称,该名称用于序列化,无论您需要什么,都可以使用它。