Доступ к SerializedName свойства объекта, определенного аннотацией

У меня есть модель, которая использует сериализатор JMS для аннотаций своих свойств. В другом классе, где я использую этот объект, я хотел бы получить доступ к информации в аннотациях. Пример:

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.

Итак, моя идея состоит в том, чтобы написать метод в этом классе, который дает мне для каждого свойства SerializedName из аннотации. Можно ли получить доступ к информации в аннотации через метод? Если да, то как?

Моя идея примерно такая:

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

Так что в "волшебной" части мне нужна помощь.


person Calamity Jane    schedule 28.02.2017    source источник


Ответы (1)


Я нашел, где происходит волшебство: в заголовок вашего класса вы должны добавить следующие операторы использования:

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

Теперь вы можете вызывать из другого класса имя, которое используется для сериализации, и делать с ним все, что вам нужно.

person Calamity Jane    schedule 02.03.2017