Управление данными формы перед сохранением сущности — Symfony 2.6

У меня есть объект, который имеет поле с именем end_date, которое является datetime. В моей форме Symfony у меня есть несвязанное поле, в котором вы можете выбрать количество дней, например, 3 дня, 5 дней, 7 дней.

Что мне нужно сделать, так это манипулировать количеством дней, предоставленных формой (которые я не хочу вводить в БД), и выполнять вычисления того, когда конечная дата будет соответствовать количеству выбранных дней, а затем сохраняться конечная дата

У меня проблемы с тем, как сделать манипулирование данными между созданием формы и сохранением сущностей в БД.

Вот моя функциональность для формы в ее нынешнем виде:

public function saveNewListing($request, $controller){
$listing = new Listing();
$product = new Product();
$listing->setProduct($product);
$product->setUser($controller->getUser());
$form = $controller->createForm(new SellType(), $auction)->handleRequest($request);

if($form->isValid()) {
$em = $controller->getDoctrine()->getManager();
$em->persist($listing);
$em->persist($product);
$em->flush();
return true;
}
return $form;
}

Таким образом, между связыванием данных формы и сущностей и проверкой правильности формы или нет, где я должен манипулировать данными? мне нужно также привязать новую дату окончания к форме? или просто связать это с сущностью?

Спасибо

0

Решение

   if($form->isValid()) {
$em = $controller->getDoctrine()->getManager();

$days = $request->get("form")["days"]
//* calc end date here $endDate as \DateTime */
$listing->setEndDate($endDate);

$em->persist($listing);
$em->persist($product);
$em->flush();
return true;
}
4

Другие решения

Хотя ответ @ Евгения технически верен, я хочу немного его расширить.

Когда вы создаете форму в Symfony, а затем вызываете handleRequest Метод, форма будет заполнена всеми представленными полями. Если вы хотите манипулировать данными вашей формы, у вас есть два возможных варианта:

  1. Сделайте любые необходимые изменения в Controller в if($form->isValid()){} кодовый блок.
  2. Создавайте события формы и манипулируйте данными до / после их заполнения. (События формы, Динамические модификации формы)

Оба варианта одинаково верны. Что вы выберете, зависит от вашего варианта использования:

  1. Если вы собираетесь использовать это FormType в одном конкретном месте вы можете легко определить свою логику внутри Controller,
  2. Если, однако, ваш FormType будет включен в другие места и должен поддерживать ту же функциональность, которую вы должны использовать при написании форм слушателей / подписчиков событий. Это исключит необходимость написания любого кода внутри Controller и дать вам финал Entity готов к сохранению в базе данных без необходимости каких-либо дальнейших изменений (так как они уже были сделаны в обработчике событий, который вы создали).
3

Я рекомендую вам сделать это в обратном вызове на prePersist. Это хорошая практика. Смотрите больше об этом http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks

1
По вопросам рекламы [email protected]