Я создаю рекламную платформу, я только что создал объект бронирования и его форму, но после того, как форма была отправлена, значение «сумма» установлено равным нулю, хотя оно не должно быть нулевым.
Я создал функцию prePersist для установки свойства суммы перед очисткой.
Вот функция prePersist в моей сущности Booking
* @ORM\PrePersist
*
* @return void
*/
public function prePersist()
{
if (empty($this->createdAt))
{
$this->createdAt = new \DateTime();
}
if (empty($this->amount))
{
$this->amount = $this->ad->getPrice() * $this->getDuration();
}
}
public function getDuration()
{
$diff = $this->endDate->diff($this->startDate);
return $this->days;
}
Мой BookingController
/**
* @Route("/annonces/{id}/booking", name = "ad_booking")
* @IsGranted("ROLE_USER")
*/
public function booking(Ad $ad, Request $request, ObjectManager $manager)
{
$booking = new Booking;
$form = $this->createForm(BookingType::class, $booking);
$user = $this->getUser();
$booking->setBooker($user)
->setAd($ad);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$manager->persist($booking);
$manager->flush();
return $this->redirectToRoute('booking_success', [
'id' => $booking->getId()
]);
}
return $this->render('booking/booking.html.twig', [
'ad' => $ad,
'bookingForm' => $form->createView()
]);
}
}
Это не работает, когда пользователь определен с помощью $this->getUser(); при подаче и проверке действительности. Это происходит впервые с тех пор, как я начал изучать Symfony. Я уверен, что, должно быть, что-то забыл, но я потратил столько времени на размышления о чем, что не вижу ответа.
и моя форма BookingType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('startDate', DateType::class, [
'label' => 'Date de début de prestatation',
'widget' => 'single_text'
])
->add('endDate', DateType::class, [
'label' => 'Date de fin de prestatation',
'widget' => 'single_text'
])
;
}
Пока форма отправляется, она должна вызвать функцию prePersist, а затем установить свойство суммы, но она возвращает значение null. Я действительно не понимаю, что я пропустил.




Поскольку кажется, что ваш PrePersist не уволен, я предполагаю, что вы, возможно, забыли аннотацию @ORM\HasLifecycleCallbacks() на своей сущности.
/**
* @ORM\Entity(repositoryClass = "App\Repository\BookingRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Booking
{
...
}
В вашем методе getDuration() вы возвращаете $this->days;, но мы не видим, как это установлено, вы, похоже, не используете результат $diff из $this->endDate->diff($this->startDate);?
Я ошибся, это хорошо public function getDuration() { $diff = $this->endDate->diff($this->startDate); return $diff->days; } а не return $this->days; Соответствует формату, я пытался изменить с помощью $diff->format('%R%a days'); но все равно не работает, это не устанавливает сумму.
Я только что узнал, что это было неправильно. Это было связано с автоматической проверкой:
в validator.yaml я прокомментировал auto_mapping с
App\Entity\Booking: true
App\Entity\User: true
Теперь все работает нормально!
Спасибо за ответ ! Я использовал аннотацию @ORM\HasLifecycleCallbacks(), я должен был уточнить ее. Вот почему я потерялся и не понимаю, что не так!