JMSSerializerBundle. no control over third party meta data

前端 未结 2 575
囚心锁ツ
囚心锁ツ 2020-12-02 20:35

I have two entities I wish to serialize with the JMSSerializerBundle. The Music Entity has a mapping-file with exclusion_policy: NONE.

The

相关标签:
2条回答
  • 2020-12-02 21:11

    I had this problem that I was getting the serializer in a wrong way. You need JMSSerializerBundle and use the service for configuration to take effect.

    So instead of:

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

    I used:

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

    Using the first way will load your configuration. Since I'm using Propel, I needed to ignore all BaseObject fields:

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

    Note that BaseObject has no namespace and you need the following packages for this to work (bugged before metadata 1.2):

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

    So I made this file:

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

    and for specific objects(in Model namespace) you need files (with default namespace as My/OtherBundle):

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

    Note: You need to clear cache when creating new serializer files

    0 讨论(0)
  • 2020-12-02 21:13

    I bet xxx\xxx\Entity\User: refers to your own namespace and class.

    If it is, it is the wrong way to do.

    The rules must be applied to the class where the properties live.

    Given the property you exposed in your configuration, I guess you're using FOSUserBundle.

    Therefore, you must apply your rules on FOS\UserBundle\Model\User.

    Then you need to add a JMSSerializer config to indicate where the serializer metadata live for the given namespace.

    It should look like:

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

    In fos/ directory you should have Model.User.yml

    With something like:

    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]
    

    Details:

    When applying rules to the Serializer through metadata, the Serializer looks for the property which are declared inside the class which is defined in the Metadata.

    Example:

    class Foo {
         protected $foo;
    }
    
    class Bar extends Foo {
         protected $bar;
    }
    

    Your metadata will look like this:

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

    THE EXAMPLE BELOW IS NOT THE CORRECT WAY TO DO

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

    if you do this, only the rules on the property bar will be applied (and exposed).

    0 讨论(0)
提交回复
热议问题