Symfony2 删除 FormType 中的空字段


Symfony2 Remove empty field in FormType

我的Symfony2 FormType中有一个onPreSubmit。

public function onPreSubmit(FormEvent $event)
{
    $data = $event->getData();
    // Avoid sending empty RegisterProduct
    foreach ($data['registerProducts'] as $key => $registerProduct) {
        if (empty($registerProduct['quantity'])) {
            unset($data['registerProducts'][ $key ]);
        }
    }
    $event->setData($data);
}

目的是删除数组值,如果这个字段中的某个字段为空(这有效(

但是当我设置数据时,我遇到了这个错误:

An exception occurred while executing 'INSERT INTO register_product ..... 
Integrity constraint violation: 1048 Column 'register_id' cannot be null

我不明白为什么。

编辑:我尝试使用onPostSubmit,但仍然有相同的错误

public function onPostSubmit(FormEvent $event)
{
    /** @var Register $register */
    $register = $event->getForm()->getData();
    foreach ($register->getRegisterProducts() as $registerProduct) {
        if ($registerProduct->getQuantity() < 1) {
            $register->removeRegisterProduct($registerProduct);
        }
    }
}

正如评论中所说,您应该在postSubmit而不是preSubmit中执行此操作。

例:

public function onPostSubmit(FormEvent $event) {
    $data = $event->getData();
    foreach ($data['registerProducts'] as $key => $registerProduct) {
        if (empty($registerProduct['quantity'])) {
            unset($data['registerProducts'][$key]);
        }
    }
});

如果 SQL 错误仍然存在,请尝试将 $event->getData() 替换为 $event->getForm()->getData() ,第一个从客户端返回数据。

编辑

不幸的是,FormEvent 不起作用。

此外,我建议在您的实体中使用 prePersist 和 preUpdate 钩子。
如果您的问题仅与表单上下文有关,则可能不是您的替代方法。

用法:

/**
 * @ORM'HasLifecycleCallbacks
 * @ORM'Entity
 */
class YourEntity
{
    // ...
    /**
     *
     * @ORM'PrePersist
     * @ORM'PreUpdate
     */
    public function manageProducts()
    {
        foreach ($this->getRegisterProducts() as $registerProduct) {
            if ($registerProduct->getQuantity() < 1) {
                $this->removeRegisterProduct($registerProduct);
            }
        }
    }
}

请参阅原则文档的事件部分。

我希望您可以使用此解决方案并且它有效。