2017-02-28 5 views
1

モデルには、そのプロパティのアノテーションにJMSシリアライザが使用されています。 このオブジェクトを使用する別のクラスでは、アノテーションの情報にアクセスしたいと思います。 例:あなたが見ることができるようにAnnotationによって定義されたオブジェクトプロパティのSerializedNameにアクセスします。

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

} 

プロパティは、私たちのコーディング標準のためokですキャメルケースのスタイル、で命名されました。しかし、このオブジェクトの情報を外部サービスに渡すためには、SerializedNameが必要です。

私の考えは、このクラスに、AnnotationのSerializedNameのすべてのプロパティを返すメソッドを書き込むことです。メソッドを介してアノテーションの情報にアクセスすることは可能ですか?はいの場合はどうですか?

私の考えのようなものです:私はいくつかの助けが必要な場所だから、「魔法」の部分がある

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

答えて

0

魔法が起こっているところ私が見つかりました:次の使用ステートメントを追加する必要があなたのクラスのヘッダーで :

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

これで、別のクラスから名前を呼び出すことができます。この名前は、シリアル化に使用され、必要なときにその名前を使用します。

関連する問題