我的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);
}
}
}
}
请参阅原则文档的事件部分。
我希望您可以使用此解决方案并且它有效。