Форум программистов, компьютерный форум, киберфорум
Наши страницы

Symfony

Войти
Регистрация
Восстановить пароль
 
Dialkord228
5 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
#1

JMS Serializer Symfony3 - PHP - Symfony

19.02.2018, 16:48. Просмотров 317. Ответов 9

Нужно выполнить десериализацию данных, полученных в виде JSON массива через POST с помощью JMS Serializer. Подскажите, как его правильно настроить и использовать? Responce должен содержать сериализованый объект, вида (использую программу Postman для отправки):
JSON
1
2
3
4
5
{
"id": 15,
"name": "Category2",
"parentId": 2
}
На вход подается такой массив:
JSON
1
2
3
4
{
"name": "Category2",
"parentId": 2
}
У меня есть вот такой контроллер, но он не использует JMS Serializer (и работатет не так, как нужно):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
 
namespace AppBundle\Controller;
 
use JMS\Serializer\Serializer;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AppBundle\Entity\Category;
use FOS\RestBundle\View\View;
use FOS\RestBundle\Controller\FOSRestController;
use Doctrine\Common\Collections\ArrayCollection;
 
class CatalogController extends FOSRestController
{
public function postAction(Request $request)
    {
        $array = []; //<---здесь вообще по идее его не должно быть
        if ($content = $request->getContent()) { //<---проверяем, есть ли что-то
            $array = json_decode($content, true);//<--- без этого десериализовать
            //$category = $this->deserialize($content); //<---не работает, возвращает 500 ошибку
        }
 
        /** @var Category $parent */
        $parent = $this->getDoctrine()->getRepository('AppBundle:Category')->find($array['parentId']);//(1)
 
        $category = new Category();//(1)
 
        $category->setName($array['name']);//(1)
 
        $category->setParent($parent);//(1)
 
        $em = $this->getDoctrine()->getManager(); //<---это точно правильно)
        $em->persist($category);
        $em->flush();
 
        return new View($category, Response::HTTP_OK);
 
    }
/**
     * @param $data
     * @return mixed
     */
    private function deserialize($data)
    {
        return $this->get('jms-serializer')->deserialize($data, 'json'); 
    }
}
Как мне сказали, то нужно провести десериализацию, результатом которой будет объект (чтобы не писать строки, которые в коде выше отмечены (1)) , который можно будет уже записать в бд.. Но я не представляю даже как это реализовать. Буду рад любой помощи. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2018, 16:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос JMS Serializer Symfony3 - PHP (Symfony):

Logout в Symfony3 - Symfony
Делаю авторизацию на симфони 3 по документации, в итоге получился вот такой security.xml security: encoders: ...

Symfony3 REST API Catalog - Symfony
Нужно сделать каталог у которого будет бесконечное количество подкаталогов (бесконечная вложенность). Методом POST нужно отослать JSON...

Создание теста для контроллера в Symfony3 - Symfony
Есть контроллер: &lt;?php namespace AppBundle\Controller; use JMS\Serializer\Serializer; use...

Как сделать множество связей One-to-one Symfony3 doctrine - Symfony
К таблице Tours нужно прикрепить 2 таблицы ToursMeta и ToursMarkup, работает только одна связь если другую убрать. &lt;?php namespace...

XML serializer - C#
начал недавно тут с сериалайзером работать но не понял как сериалихзировать сложные классы данных, подскажите кто знает? или статейку кукую

DOM XML Serializer - форматирование. - Java
На основе DOM документа формирую xml файлик. У ряда нодов достаточно много атрибутов. В готовом документе подучаются очень длинные...

9
Jewbacabra
Эксперт PHP
2972 / 2559 / 952
Регистрация: 24.04.2014
Сообщений: 7,815
19.02.2018, 21:37 #2
Цитата Сообщение от Dialkord228 Посмотреть сообщение
PHP
1
$this->get('jms-serializer')->deserialize($data, 'json')
jms_serializer
Метод deserialize принимает 3 аргумента, а не два. Первым аргументом указывается исходная строка.
Вторым аргументом указывеатся тип, в который нужно поместить результат работы, а формат третьим.
https://jmsyst.com/bundles/JMSSerializerBundle
Цитата Сообщение от Dialkord228 Посмотреть сообщение
не работает, возвращает 500 ошибку
В симфони есть debug режим, который даст более подробную информацию об ошибке
0
Dialkord228
5 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
20.02.2018, 11:23  [ТС] #3
Jewbacabra, и даже так не работает, 500 ошибка и всё...
PHP
1
$category = $this->get('jms_serializer')->deserialize($content,'Category','json');
0
Jewbacabra
Эксперт PHP
2972 / 2559 / 952
Регистрация: 24.04.2014
Сообщений: 7,815
20.02.2018, 11:35 #4
Dialkord228, 500 ошибка может означать что угодно. Нужно подробнее.
Нужно указывать полное имя класса, со всеми неймспейсами. Удобно использовать ::class
PHP
1
2
3
use Namespace\Category;
//...
Category::class;
1
Dialkord228
5 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
20.02.2018, 22:46  [ТС] #5
Jewbacabra, спасибо вам за помощь, буду разбираться и искать ошибку...

Добавлено через 10 часов 3 минуты
Jewbacabra, немного разобрался, но вылезла другая проблема: когда я подаю на вход жейсон массив вида:
JSON
1
2
3
4
{ 
    "name": "Mr-parent", 
    "parentId": "27" 
}
, то на выходе я получаю:
JSON
1
2
3
4
{
    "id": 33,
    "name": "Mr-parent"
}
, то-есть parentId попросту не записался, после
PHP
1
$content = $request->getContent();
он еще есть, но после десериализации:
PHP
1
$category = $this->get('jms_serializer')->deserialize($content,'AppBundle\Entity\Category','json');
его уже нет.
Я так понимаю, что id это integer, а вот parentId - это уже объект класса Category. Но как же сделать так, чтобы он тоже записался, вообще ума не приложу, может подскажете чего?
0
Jewbacabra
Эксперт PHP
2972 / 2559 / 952
Регистрация: 24.04.2014
Сообщений: 7,815
21.02.2018, 00:13 #6
Dialkord228, десериализовать в Entity очень плохая идея.
0
Dialkord228
5 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
21.02.2018, 15:35  [ТС] #7
Jewbacabra, а что можно сделать, чтобы режить эту проблему? Перелопатил всё, что мог, но так и не нашел ничего внятного...
0
Jewbacabra
Эксперт PHP
2972 / 2559 / 952
Регистрация: 24.04.2014
Сообщений: 7,815
21.02.2018, 21:36 #8
Dialkord228, не очень понятно что надо сделать. Задача сериалайзера - из такой строки
JSON
1
2
3
4
{ 
    "name": "Mr-parent", 
    "parentId": "27" 
}
Получить php объект с соответствующими полями
Откуда вдруг взялся id 33 не понятно
0
Dialkord228
5 / 5 / 3
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
22.02.2018, 12:21  [ТС] #9
Jewbacabra, после persist взялся ID. Вот мой вопрос на stack overflow:https://stackoverflow.com/q/48908349/9391394
0
Jewbacabra
Эксперт PHP
2972 / 2559 / 952
Регистрация: 24.04.2014
Сообщений: 7,815
22.02.2018, 22:32 #10
Dialkord228, нужно
1) создать класс для приема запросов, например AppBundle\Request\Category. Настроить для него правила серриализации и валидации.
2) по parentId достать сущность AppBundle\Entity\Category, если не нашлась кинуть 404
3) Создать новую сущность, в качестве parent установить ей сущность полученную на предыдущем шаге. persist, flush
4) серриализовать новую сущность
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2018, 22:32
Привет! Вот еще темы с ответами:

JMS purpose - Java EE
Мне сказали что JMS предназначен для общения между модулями одного или нескольких приложений. Так ли это?

подскажите спецификацию по JMS - Java EE
Господа Не могу врубиться в суть JMS На сервере запускается какой-нить сервлет, который инициирует чтото типа Queue и...

JMS и Web приложение - Java EE
Добрый день, пишу приложение(NetBeance и сервер GlassFish) где хочу реализовать чат, в GlassFish создаю сервер для JMS и Topic, на клиенте...

Jms,rmi,socket - Java Сети
Всем привет! И сегодня я задаю очередной тупой вопрос(баян). Я ознакомился с jms,RMI и сокетами. 1) Я понимаю что отличие сокетов от RMI...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru