2016-03-05 3 views
2

В настоящее время я работаю над созданием API с фреймворком Symfony. Я достаточно прочитал, чтобы узнать, как использовать компонент Serialization, и создал некоторые пользовательские нормализаторы для моих объектов. Как это в настоящее время работает в:Преобразование JSON в Doctrine Entity в Symfony

JSON -> Array (Decode) -> User Entity (Денормализовать)

Это работает поиск до тех пор, пока содержание запроса было JSON представление пользователя, например:

{ 
    "email": "[email protected]", 
    "plainPassword": "demouser", 
    "first_name" : "Demo", 
    "last_name" : "User" 
} 

объект пользователя создается с помощью следующего кода в моем контроллере:

$newuser = $this->get('api.serializer.default')->deserialize($request->getContent(), WebsiteUser::class, 'json'); 

Однако, я хотел бы гнездиться пользователю JSON в собственности «данные» в виде JSON объект, который позволит потребителям передавать дополнительные метаданные с запросом, например:

{ 
    "options": [ 
    { 
     "foo": "bar" 
    } 
    ], 
    "data": [ 
    { 
     "email": "[email protected]", 
     "plainPassword": "demouser", 
     "first_name": "Demo", 
     "last_name": "User" 
    } 
    ] 
} 

Основной вопрос это вызывает то, что десериализации не удается, так как формат JSON изменился.

Единственным решением, которое я рассмотрел до сих пор, является json_decode весь тело запроса, захватить элемент данных этого массива и передать содержимое элемента данных в denormalizer (вместо десериализатора).

Есть ли лучший способ решить эту проблему?

ответ

0

Вы должны быть в состоянии получить конкретный ключ вашего тела запроса, как следует:

$newuser = $this->get('api.serializer.default')->deserialize(
    $request->request->get('data'), WebsiteUser::class, 'json' 
); 

Если вы не в состоянии извлечь данные из ключа без декодирования тела запроса, смотрите на this bundle, он состоит только в одном EventListener, который заменяет тело запроса после его декодирования.

Вы можете легко интегрировать одну и ту же логику в ваше приложение или напрямую связать ее (что хорошо работает).

Смежные вопросы