2017-05-15 18 views
0

私はSymfony 3、Doctrine 2、FOS RestバンドルとJMSシリアライザを使用しています。 私は、アプリ全体で[すべてを除外]ポリシーを使用して、フィールドを選択的に公開しています。Jmsシリアライザ動的露出

ユーザーエンティティでは、現在のユーザーに対してのみ追加のフィールドを公開できます。

たとえば、通常のapi/user/{id}エンドポイントでは、通常のデータを公開したいが、次にapi/user/currentのデータを少しだけ公開したい。

例:

/** 
* ... 
* @Serializer\ExclusionPolicy("all") 
*/ 
class Users implements UserInterface 
{ 
    /** 
    * @var string 
    * @Serializer\Expose 
    * 
    * @ORM\Column(name="name", type="string", length=255, nullable=true) 
    */ 
    private $name; 


    /** 
    * @var string 
    * 
    * @ORM\Column(name="secretfield", type="string", length=255, nullable=true) 
    */ 
    private $secretfield; 

私は@groupsデコレータを試してみましたが、それはフィールドのみダウン削るを促進するために働き、私は負荷を変更し、どこでも「デフォルト」グループのコンテキストを設定するように注意して必要になります。

私はthe docsに記載されているDynamic Exclusion Strategyを見ましたが、私が必要としているかどうか、そしてどの変数を使って式を構築することができるかわかりません。

これを行うにはどのような方法が最適でしょうか?

答えて

1

私の主な心配は、除外ポリシーをnoneに設定することから来る "デフォルトですべて送信"の動作でした。

しかし、グループをもう少し見て、設定でデフォルトグループを設定できることがわかりました。

これを私のユーザーコントローラでテストしましたが、エンティティまたはシリアライザのコンテキストにグループを指定しないと、何も返されませんでした。 @Serializer\Exposeの代わりに@Serializer\Groups({"default"})を使用するようにエンティティを変更しました。私が始めたときと同じ返されたデータに戻ってきました。

次に、私のエンティティの秘密フィールドにcurrent_userグループを追加し、シリアライザコンテキストにグループを追加して、その特定のビューの追加フィールドを取得しました。エンティティで

/** 
* ... 
* @Serializer\ExclusionPolicy("none") 
*/ 
class Users implements UserInterface 
{ 
    /** 
    * @var string 
    * @Serializer\Groups({"default"}) 
    * 
    * @ORM\Column(name="name", type="string", length=255, nullable=true) 
    */ 
    private $name; 


    /** 
    * @var string 
    * @Serializer\Groups({"current_user"}) 
    * 
    * @ORM\Column(name="secretfield", type="string", length=255, nullable=true) 
    */ 
    private $secretfield; 

とコントローラで:

/** 
* @Rest\Get("user/current") 
* 
* @return \FOS\RestBundle\View\View 
*/ 
public function getCurrentAction() 
{ 
    $me = $this->getUser(); 

    $view = new View($me, Response::HTTP_OK); 
    /** @var Context $context */ 
    $context = $view->getContext(); 
    $context->setGroups(['current_user', 'default']); 
    $view->setContext($context); 

    return $view; 
} 
+0

あなたはこのようなグローバルグループを設定した場合、あなたはすべての単一のエンティティクラスで、すべてのグループを指定する必要があります表示したいプロパティーなので、理想的ではありません。 exposeを使用すると、特定のエンティティにデフォルトでは何も公開されず、公開するエンティティを指定することができますが、他のファイルではすべて公開される可能性があります。このメソッドでは、すべてを返すだけのエンティティ内のすべてのプロパティに注釈を付ける必要があります。 – Jayd

関連する問題