У меня есть объект "Пользователь", содержащий адрес. Я сохраню адрес как 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;
}
}
@fucethebads, доктрина сохраняет поле как пустое, когда строка сериализации комментируется в контроллере
ах, ладно, пойми. Doctrine не умеет разбирать только массивы. поэтому я бы сказал, что вам нужно определить поле как текст и самостоятельно распечатать / сериализовать его
Как насчет использования прослушивателя событий Doctrine для сериализации? вам придется реализовать сериализацию вручную, но только один раз. symfony.com/doc/current/doctrine/…
Почему бы вам не использовать $form->handleRequest($request)? Вы не должны выполнять сериализацию в вашем контроллере. Доктрина должна с этим справиться. И если вы действительно этого хотите, посмотрите на прослушиватели событий или преобразователи данных. Symfony следует философии «тонких контроллеров и толстых моделей».
@StephanVierkant Мне нужно отправить форму вручную (данные отправляются через ajax в формате json, и я хочу использовать форму для проверки полей). Я знаю, что мне не следует выполнять сериализацию в контроллере, но когда я ушел, доктрина вернула пустой json. Согласно документации, doctrine использует функции кодирования PHP JSON, поэтому образец дампа (json_encode ($ user-> getAddress ())) также возвращает пустой json. Я не знаю, есть ли способ указать доктрине использовать сериализатор jms
@ MarçalBerga, спасибо, я пойду




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 не нужно делать свойства общедоступными. Вместо этого используйте геттеры и сеттеры.
класс адреса не использует аннотацию доктрины (например, объект или столбец).
если вы настроите Doctrine на использование json, он будет разбираться самостоятельно. Если вы хотите сделать это вручную, вы должны использовать текст для доктрины и каждый раз разбирать его самостоятельно.