EasyAdminBundle: как перенаправить обратно в форму - PullRequest
0 голосов
/ 28 ноября 2018

В административной панели, созданной с помощью EasyAdminBundle, администратор может создать новое бронирование.Я хочу добавить проверку доступности (через службу), прежде чем этот новый экземпляр бронирования будет сохранен в базе данных.Если эта проверка возвращает false, администратор должен быть перенаправлен обратно в форму.

Я расширил класс EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController и переопределил функцию persistEntity():

...
use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController as BaseAdminController;

class BookingController extends BaseAdminController
{
    private $availabilityService;

    public function __construct(AvailabilityService $availabilityService)
    {
        $this->availabilityService = $availabilityService;
    }

    protected function persistEntity($booking)
    {
        $checkin = Carbon::instance($booking->getCheckin());
        $checkout = Carbon::instance($booking->getCheckout());

        if($this->availabilityService->checkAvailability($checkin, $checkout)) {
            parent::persistEntity($booking);
        } else {
            return false; //redirect back to the form
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я нашел решение (Выкторя привел меня на правильный путь).Убедитесь, что вы вызываете только проверку соответствующего объекта с instanceof.Если проверка не удалась, перенаправьте пользователя в форму редактирования, передав заголовок запроса реферера.

  if ($newForm->isSubmitted() && $newForm->isValid()) {

     if ($entity instanceof Booking) {
        $formData = $newForm->getData();

        if(!$this->availabilityService->checkAvailability($formData->getCheckin(), $formData->getCheckout())) {
           return $this->redirect($this->request->headers->get('referer'));
         }
      }

    return $this->redirectToReferrer();
  }
0 голосов
/ 28 ноября 2018

Я думаю, что вместо этого вы должны переопределить newAction и отредактировать

if ($newForm->isSubmitted() && $newForm->isValid()) {

примерно так:

if ($newForm->isSubmitted() && $newForm->isValid()) {
   if ($this->availabilityService->checkAvailability($entity)) {

Если это не соответствует вашим потребностям, вы можете написать EventListener для EasyAdminEvents:: PRE_PERSIST и вернуть перенаправление на newAction.EventListener будет более сложным, поскольку событие отправляется новым и отредактированным объектам.

...