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

У меня есть объект User, который содержит адрес. Я сохраню адрес как 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;
      }
}

person John    schedule 27.06.2018    source источник
comment
если вы настроите Doctrine на использование json, он будет анализировать сам. Если вы хотите сделать это вручную, вы должны использовать текст для доктрины и анализировать его каждый раз самостоятельно.   -  person fucethebads    schedule 27.06.2018
comment
@fucethebads, доктрина сохраняет поле как пустое, когда строка сериализации комментируется в контроллере   -  person John    schedule 27.06.2018
comment
ну ладно, понял. Doctrine может анализировать только массивы. поэтому я бы сказал, что вы должны определить поле как текст и отменить/сериализовать его самостоятельно   -  person fucethebads    schedule 27.06.2018
comment
Как насчет использования Doctrine Event Listener для сериализации? вам придется реализовать сериализацию вручную, но только один раз. symfony.com/doc/current/doctrine/   -  person Marçal Berga    schedule 27.06.2018
comment
Почему бы вам не использовать $form->handleRequest($request)? Вы не должны выполнять сериализацию в своем контроллере. Доктрина должна справиться с этим. И если вы действительно этого хотите, загляните в Event Listeners или Data Transformers. Symfony следует философии тонких контроллеров и толстых моделей.   -  person Stephan Vierkant    schedule 27.06.2018
comment
@StephanVierkant Мне нужно отправить форму вручную (данные отправляются через ajax в формате json, и я хочу использовать форму для проверки полей). Я знаю, что не должен делать сериализацию в контроллере, но когда я ушел, эта доктрина возвращает пустой json. Согласно документации, доктрина использует функции кодирования JSON в PHP, поэтому пример дампа (json_encode($user->getAddress()))) также возвращает пустой файл json. Я не знаю, есть ли способ указать доктрине использовать сериализатор jms.   -  person John    schedule 27.06.2018
comment
@MarçalBerga спасибо, я пойду   -  person John    schedule 27.06.2018


Ответы (1)


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

person John    schedule 27.06.2018
comment
Вам не нужно делать свойства общедоступными при использовании Doctrine. Вместо этого используйте геттеры и сеттеры. - person Stephan Vierkant; 27.06.2018
comment
адресный класс не использует аннотацию доктрины (например, сущность или столбец). - person John; 27.06.2018