У меня есть объект, который имеет поле с именем 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;
}
Таким образом, между связыванием данных формы и сущностей и проверкой правильности формы или нет, где я должен манипулировать данными? мне нужно также привязать новую дату окончания к форме? или просто связать это с сущностью?
Спасибо
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;
}
Хотя ответ @ Евгения технически верен, я хочу немного его расширить.
Когда вы создаете форму в Symfony, а затем вызываете handleRequest
Метод, форма будет заполнена всеми представленными полями. Если вы хотите манипулировать данными вашей формы, у вас есть два возможных варианта:
Controller
в if($form->isValid()){}
кодовый блок.Оба варианта одинаково верны. Что вы выберете, зависит от вашего варианта использования:
FormType
в одном конкретном месте вы можете легко определить свою логику внутри Controller
, FormType
будет включен в другие места и должен поддерживать ту же функциональность, которую вы должны использовать при написании форм слушателей / подписчиков событий. Это исключит необходимость написания любого кода внутри Controller
и дать вам финал Entity
готов к сохранению в базе данных без необходимости каких-либо дальнейших изменений (так как они уже были сделаны в обработчике событий, который вы создали).Я рекомендую вам сделать это в обратном вызове на prePersist. Это хорошая практика. Смотрите больше об этом http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks