Symfony EasyAdminBundle:如何重定向回表单

Symfony EasyAdminBundle:如何重定向回表单,symfony,symfony-forms,symfony4,easyadmin,Symfony,Symfony Forms,Symfony4,Easyadmin,在使用EasyAdminBundle创建的管理面板中,管理员可以创建新的预订。我希望在将此新预订实例持久化到数据库之前,通过服务添加可用性检查。如果此检查返回false,则应将管理员重定向回表单 我已扩展了EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController类并重写了persistEntity函数: ... use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController

在使用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
        }
    }
}

我认为您应该覆盖newAction并编辑它

if ($newForm->isSubmitted() && $newForm->isValid()) {
像这样的事情

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

如果这不符合您的需要,您可以为easyadminivents::PRE_PERSIST编写一个EventListener,并返回重定向到newAction。当事件被分派到新实体和编辑的实体上时,EventListener将更加复杂。

我找到了Vyctorya引导我找到正确路径的解决方案。确保您只调用instanceof相关实体的检查。如果检查失败,则通过传入referer请求头将用户重定向到编辑表单

  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();
  }