Платформа API: контекст нормализации игнорируется во вложенных объектах

#php #symfony #serialization #api-platform.com

Вопрос:

У меня есть объект ресурсов API, подобный этому:

 /**
 * @ApiResource(
 *     collectionOperations={},
 *     itemOperations={"get"},
 *     normalizationContext={"groups"={"read"}},
 * )
 */
class A
{
    /**
     * @var array<B>
     * @Groups("read")
     */
    private array $b;

    // ...
}
 

@Groups Аннотация для свойств работает, я получаю только те, с @Groups("read") которыми .

Но у меня есть вложенные объекты, подобные этому:

 class B
{
    /**
     * @var array<C>
     * @Groups("read")
     */
    private array $c;

    // ...
}

class C
{

    /**
     * @Groups("read")
     */
    private string $foo;

    private string $bar;

    // ...
}
 

В B , @Groups аннотации по-прежнему соблюдаются, но в C я получаю все свойства, полностью игнорируя аннотации.

Ожидаемый результат, такой как:

 {
  "b": [
    {
      "c": [
        {
          "foo": "This should be public"
        }
      ]
    }
  ]
}
 

Получил вывод, как:

 {
  "b": [
    {
      "c": [
        {
          "foo": "This should be public"
          "bar": "This should be private"
        }
      ]
    }
  ]
}
 

Что мне нужно сделать, чтобы это сработало?

(если это имеет значение, то ни B то , ни C другое не является @ApiResource , но C является Доктриной @Entity . Я использую пользовательский поставщик данных для A )

Ответ №1:

Я обнаружил, что это… C реализовано JsonSerializable по другим причинам, и представление JSON из jsonSerialize() содержащихся foo и bar .

Платформа API, по-видимому, использует это, если она существует. Кое-чему научился!