JMSSerializerBundle. нет контроля над сторонними метаданными

У меня есть две сущности, которые я хочу сериализовать с JMSSerializerBundle.Music У сущности есть файл сопоставления сexclusion_policy: NONE.

Music сущность имеет поле сущностиUser изFOSUserBundle,User Сущность имеет файл сопоставления сexclusion_policy: ALL с несколькими полями, установленными наexpose: 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 класс, который также не имеет доступа к родительским защищенным полям, которые я пытаюсь исключить.

Ответы на вопрос(2)

что я получал сериализатор неправильно. Тебе нужно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

Примечание. Необходимо очистить кэш при создании новых файлов сериализатора.

 Anorgan30 авг. 2014 г., 23:31
Эта информация по очистке кэша помогла мне, спасибо!
Решение Вопроса

xxx\xxx\Entity\User: относится к вашемусобственное пространство имен и класс.

Если это так, этонеправильно способ сделать.

Правила должны применяться к классу, где живут свойства.

Учитывая свойство, которое вы выставили в своей конфигурации, я полагаю, вы используетеFOSUserBundle.

Поэтому вы должны применять свои правила кFOS\UserBundle\Model\User.

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

Это должно выглядеть так:

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 будет применяться (и подвергаться).

 tolgap18 окт. 2012 г., 21:14
Таким образом, я могу удалить отображение для MyBundle / Entity / User, которое расширяет FOSUserBundle / Entity / User?
 Boris Guéry18 окт. 2012 г., 21:20
@tolgap, да, скорее всего, для каждой модификации метаданных.
 Sean Quinn14 сент. 2013 г., 02:00
Извините, что поднял призрак этого вопроса и ответа, но я заметил, чтоdirectories а такжеauto_detection не похоже, чтобы работать вместе. Если я попытаюсь переопределить местоположение, где JMS ищет сторонние метаданные, оно не будет применено. Но если я помещу те же самые метаданные в путь по умолчанию / ожидаемый и закомментирую конфигурацию каталога вjms_serializer это применяется Я предполагаю, что оба должны работать в тандеме?
 Boris Guéry18 окт. 2012 г., 21:15
ну, это зависит от того, нужно ли удалять его, только если вы не пытаетесь применить правила к собственному имуществу. Если вы расширили пользовательскую модель / сущность и добавили свойства, вы должны сохранить их, но включить только свойство, определенное вами самостоятельно.User класс.
 tolgap18 окт. 2012 г., 21:16
Спасибо, я должен очистить кеш?

Ваш ответ на вопрос