如何在FormEvents::PRE_SUBMIT事件中添加计算字段

如何在FormEvents::PRE_SUBMIT事件中添加计算字段,events,listener,symfony-forms,symfony,Events,Listener,Symfony Forms,Symfony,在我的侦听器中,我需要在FormEvents::PRE_SUBMIT事件中访问我的实体。在POST_SET_DATA中,这没有问题,只需使用$event->getData() 因此,对于收听POST\u SET\u DATA的事件,我可以接受以下代码: public function postSetData(FormEvent $event) { $form = $event->getForm(); $day = $event->getData(); $tot

在我的侦听器中,我需要在
FormEvents::PRE_SUBMIT
事件中访问我的实体。在
POST_SET_DATA
中,这没有问题,只需使用
$event->getData()

因此,对于收听
POST\u SET\u DATA
的事件,我可以接受以下代码:

public function postSetData(FormEvent $event)
{
    $form = $event->getForm();
    $day = $event->getData();
    $total = $this->dayManager->calculateTotal($day); // Passing a Day object, yay!

    $form->get('total')->setData($total);
}
但是,在我的
PRE_SUBMIT
事件方法中

我需要这个函数,因为在提交时,总计不是用新提交的数据计算的

正如你所看到的,它是有效的。然而,这是一个如此黑客的方式,我不相信专业的这样做。这里有两个问题:

  • 无法在
    preSubmit
    功能中使用实体
    Day
    对象
  • 必须在
    dayManager
  • preSubmit
    函数中的原始事件数组匹配的丑陋代码

因此,主要问题是:如何在
提交前
表单事件中从表单获取更新的
日期
对象。

使用
提交
而不是
提交前

别担心,表单还没有提交,
SUBMIT
就在
form::SUBMIT

你为什么会遇到这个问题?

PRE_SUBMIT
中的所有数据尚未规范化为您的常用对象


如果您想了解更多有关整个事件的信息,请访问:

感谢@galeaspablo提交答案!然而,我在我的代码下面添加了如何解决我的特定问题

我的目标是在表单中显示计算出的总字段。没别的了。但是在
SUBMIT
事件中,您不能执行
$form->get('total')->setData($total)。您将收到一条警告:
您无法更改已提交表单的数据。

因此,在提交前修改表单是不可能的。但是添加字段

我的完整解决方案如下:

在DayType formbuilder中:

// Will add total field via subscriber
//->add('total', TimeType::class, ['mapped' => false])
在事件订阅服务器中:

class CalculateDayTotalFieldSubscriber implements EventSubscriberInterface
{

    private $dayManager;

    public function __construct(DayManager $dayManager)
    {
        $this->dayManager = $dayManager;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::SUBMIT => 'addTotalField',
            FormEvents::POST_SET_DATA => 'addTotalField'
        );
    }


    public function addTotalField(FormEvent $event)
    {
        $form = $event->getForm();
        $day = $event->getData();

        $total = $this->dayManager->calculateTotal($day);
        $form->add('total', TimeType::class, ['mapped' => false, 'data' => $total]);
    }
}

请注意,
SUBMIT
POST\u SET\u DATA
事件都使用了保存功能。一本好书是:

Hi@galeaspablo,谢谢你的回答。我已经知道我需要使用::SUBMIT,但是你是第一个给出答案的人!所以你得到了学分;-)我将在下面添加一个答案,说明我是如何在代码库中解决它的。
class CalculateDayTotalFieldSubscriber implements EventSubscriberInterface
{

    private $dayManager;

    public function __construct(DayManager $dayManager)
    {
        $this->dayManager = $dayManager;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::SUBMIT => 'addTotalField',
            FormEvents::POST_SET_DATA => 'addTotalField'
        );
    }


    public function addTotalField(FormEvent $event)
    {
        $form = $event->getForm();
        $day = $event->getData();

        $total = $this->dayManager->calculateTotal($day);
        $form->add('total', TimeType::class, ['mapped' => false, 'data' => $total]);
    }
}