Сериализация с помощью jms в Symfony

У меня есть объект "Пользователь", содержащий адрес. Я сохраню адрес как json в своей базе данных. После проверки формы я должен вручную сериализовать адрес перед сохранением данных. Есть ли способ избежать этого? Можно ли вызвать событие сериализации, когда доктрина сохраняет данные?

class User{
    /**
    * @ORM\Column(name = "username", type = "string", length=30)
    **/
    private $username;

    /**
    * @ORM\Column(name = "address", type = "json")
    **/
    private $address;
}

class Address{
   private $postalcode;
   private $street;
}

// Внутри моего контроллера

class UserController extends Controller{

    /**
     * @Rest\View(StatusCode = Response::HTTP_CREATED)
     *
     * @Rest\Post(
     *   path = "/user",
     *   name = "user_create"
     * )
     */
      public function createAction(){
         $user = new User();
         $form = $this->createForm(UserType::class, $user);
         $form->submit($request->request->all());

         if ($form->isValid())
         {
            $em = $this->getDoctrine()->getManager();
            $user->setAddress($this->get('jms_serializer')->serialize($user->getAddress(), 'json'));

            $em->persist($user);
            $em->flush();

            return $this->view($user, Response::HTTP_CREATED);
         }

         return $form;
      }
}

если вы настроите Doctrine на использование json, он будет разбираться самостоятельно. Если вы хотите сделать это вручную, вы должны использовать текст для доктрины и каждый раз разбирать его самостоятельно.

fucethebads 27.06.2018 11:09

@fucethebads, доктрина сохраняет поле как пустое, когда строка сериализации комментируется в контроллере

John 27.06.2018 11:13

ах, ладно, пойми. Doctrine не умеет разбирать только массивы. поэтому я бы сказал, что вам нужно определить поле как текст и самостоятельно распечатать / сериализовать его

fucethebads 27.06.2018 12:00

Как насчет использования прослушивателя событий Doctrine для сериализации? вам придется реализовать сериализацию вручную, но только один раз. symfony.com/doc/current/doctrine/…

Marçal Berga 27.06.2018 12:42

Почему бы вам не использовать $form->handleRequest($request)? Вы не должны выполнять сериализацию в вашем контроллере. Доктрина должна с этим справиться. И если вы действительно этого хотите, посмотрите на прослушиватели событий или преобразователи данных. Symfony следует философии «тонких контроллеров и толстых моделей».

Stephan Vierkant 27.06.2018 12:43

@StephanVierkant Мне нужно отправить форму вручную (данные отправляются через ajax в формате json, и я хочу использовать форму для проверки полей). Я знаю, что мне не следует выполнять сериализацию в контроллере, но когда я ушел, доктрина вернула пустой json. Согласно документации, doctrine использует функции кодирования PHP JSON, поэтому образец дампа (json_encode ($ user-> getAddress ())) также возвращает пустой json. Я не знаю, есть ли способ указать доктрине использовать сериализатор jms

John 27.06.2018 13:37

@ MarçalBerga, спасибо, я пойду

John 27.06.2018 13:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
7
448
1

Ответы 1

Doctrine не удалось сделать это json, потому что свойство адреса было закрытым (PHP json_encode возвращает пустую структуру). Публикация решит проблему. При определении типа как json, doctrine будет использовать функции кодирования json php: https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#json-array Спасибо

При использовании Doctrine не нужно делать свойства общедоступными. Вместо этого используйте геттеры и сеттеры.

Stephan Vierkant 27.06.2018 15:25

класс адреса не использует аннотацию доктрины (например, объект или столбец).

John 27.06.2018 15:51

Другие вопросы по теме