25

JMSSerializerBundle でシリアライズしたいエンティティが 2 つあります。エンティティにはのMusicマッピング ファイルがありexclusion_policy: NONEます。

エンティティには、からのMusicエンティティのフィールドがあります。エンティティには、いくつかのフィールドが に設定されたマッピング ファイルがあるため、シリアル化されます。UserFOSUserBundleUserexclusion_policy: ALLexpose: true

問題は、Userフィールドが完全にシリアル化されることです。Userエンティティのマッピング ファイルを変更しても問題ありません。

これはどのように見えるかです:

#My/Bundle/Resources/config/serializer/Entity.Music.yml
xxx\xxx\Entity\Music:
    exclusion_policy: NONE

#My/Bundle/Resources/config/serializer/Entity.User.yml
xxx\xxx\Entity\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        username:
            expose: true
        username_canonical:
            exclude: true
        email:
            exclude: true
        email_canonical:
            exclude: true
        enabled:
            exclude: true
        salt:
            exclude: true
        password:
            exclude: true
        last_login:
            exclude: true
        confirmation_token:
            exclude: true
        password_requested_at:
            exclude: true
        groups:
            exclude: true
        locked:
            exclude: true
        expired:
            exclude: true
        expires_at:
            exclude: true
        roles:
            expose: true
        credentials_expired:
            exclude: true
        credentials_expired_at:
            exclude: true

独自のマッピング ファイルを参照しないのはなぜですか? それとも私はどこか間違っていますか?

これまでに何を試しましたか

サードパーティのメタデータ ドキュメントを読みました。シリアライザ サービスに新しいディレクトリを追加するように指示するだけです。私はそれをしましたが、FOS\UserBundle\Entityクラスを拡張する必要があり、除外しようとしている親の保護フィールドにもアクセスできません。

4

2 に答える 2

66

独自の名前空間とクラスxxx\xxx\Entity\User:を参照するに違いありません。

もしそうなら、それは間違ったやり方です。

プロパティが存在するクラスにルールを適用する必要があります。

構成で公開したプロパティを考えると、 を使用していると思いますFOSUserBundle

したがって、ルールを に適用する必要がありますFOS\UserBundle\Model\User

JMSSerializer次に、特定の名前空間のシリアライザー メタデータが存在する場所を示す構成を追加する必要があります。

次のようになります。

jms_serializer:
  metadata:
    auto_detection: true
    directories:
      FOSUserBundle:
        namespace_prefix: "FOS\\UserBundle"
        path: "@YourUserBundle/Resources/config/serializer/fos"

ディレクトリにfos/は Model.User.yml が必要です

次のようなもので:

FOS\UserBundle\Model\User:
  exclusion_policy: ALL
  properties:
    id:
      expose: true
      groups: [list, details]
    username:
      expose: true
      groups: [details]
    email:
      expose: true
      groups: [me]
    roles:
      expose: true
      groups: [details]

詳細:

メタデータを介してルールをシリアライザーに適用する場合、シリアライザーは、メタデータで定義されているクラス内で宣言されているプロパティを探します。

例:

class Foo {
     protected $foo;
}

class Bar extends Foo {
     protected $bar;
}

メタデータは次のようになります。

Foo:
  exclusion_policy: ALL
  properties:
      foo: 
          expose: true

Bar:
  exclusion_policy: ALL
  properties:
      bar: 
          expose: true

以下の例は正しい方法ではありません

Bar:
  exclusion_policy: ALL
  properties:
      foo: 
          expose: true
      bar: 
          expose: true

これを行うと、プロパティのルールのみbarが適用 (および公開) されます。

于 2012-10-18T19:11:17.870 に答える
4

シリアライザーを間違った方法で取得していたというこの問題がありました。JMSSerializerBundle構成を有効にするには、サービスを使用する必要があります。

したがって、代わりに:

//In controller we can use $this instead of $container
$serializer = $this->get('jms_serializer'); //JMSSerializerBundle

私が使用した:

$serializer = SerializerBuilder::create()->build(); //JMSSerializer

最初の方法を使用すると、構成が読み込まれます。を使用しているため、すべてのフィールドPropelを無視する必要がありました。BaseObject

#app/config.yml
jms_serializer:
metadata:
    auto_detection: true
    directories:
        Propel:
            namespace_prefix: ""
            path: "@MySupporterBundle/Resources/config/serializer"

BaseObjectには名前空間がなく、これを機能させるには次のパッケージが必要であることに注意してください (メタデータ 1.2 より前にバグがあります)。

        "jms/serializer": "0.12.*",
        "jms/serializer-bundle" : "0.12.*@dev",
        "jms/metadata" : "1.3.*",

だから私はこのファイルを作りました:

#My/SupporterBundle/Resources/config/serializer/BaseObject.yml
BaseObject:
    exclusion_policy: ALL

特定のオブジェクト (モデル名前空間内) には、ファイルが必要です (デフォルトの名前空間は My/OtherBundle です):

My/OtherBundle/Resources/config/serializer/Model.om.BaseClass.yml My/OtherBundle/Resources/config/serializer/Model.Class.yml

注: 新しいシリアライザ ファイルを作成するときは、キャッシュをクリアする必要があります

于 2013-04-18T10:42:15.270 に答える