我使用Symfony 3.4和doctrine,并且遇到由事件监听器更改的数据的问题。
如果提交了表单并且Doctrine PreUpdate EventLister更改了实体值,则表单中不会显示该表单。
名为Activity的实体示例,该实体具有属性$ number:
/**
* @ORM\Entity
* @ORM\Table(name="activity")
* @ORM\EntityListeners({"ActivityListener"})
*/
class Activity
{
/**
* @ORM\Column(type="integer")
*/
private $number ;
...
Getters, Setters an other stuff...
}
还有一个事件监听器:
class ActivityListener
{
// Events
public function get()
{
return ( ['preUpdate']);
}
public function preUpdate(Activity $activity, LifecycleEventArgs $args)
{
$activity->setNumber(1) ;
}
}
控制器中的表格处理,假设我提交了表格,例如0作为我的号码字段的值:
class ActivityController
{
...
// Create form and handle request
$form = $this->createForm (ActivityForm::class, $activity) ;
$this->form->handleRequest ( $this->request ) ;
if ( $this->form->isSubmitted() )
{
// $activity->number == 0 as entred in HTML Form
$this->em->persist($activity) ;
$this->em->flush();
// $activity->number == 1 as set in PreUpdate Event
}
$this->view = $this->form->createView () ;
...
}
所以"数字" eventListener将字段正确设置为1并正确保存到数据库。
但表格是用" 0"在数字字段中,可能是因为已经使用createForm命令获取了值?
我如何能够在表格中正确显示我的事件监听器写入实体的新值?
谢谢你,亲切的问候, 的Sascha
答案 0 :(得分:0)
preUpdate
事件在提交表单后发生,这就是为什么在表单中,0仍然显示。
如果您希望它已经为1,则preUpdate
事件不是您应该使用的事件。您可以手动更新它,或在表单字段中将1设置为默认值。
答案 1 :(得分:0)
我找到了解决问题的方法。保存实体后,我只需重新创建表单,即可包含修改后的值。
在处理表单提交的控制器中大致如此:
$this->form->handleRequest ( $this->request ) ;
if ($this->form->isValid() )
{
// Persist data
$this->em->persist($this->entity) ;
// At this point, entity data has been modified by PreUpdate Event
$this->em->flush();
$this->flashbag->add ( 'success', $this->translator->trans('form.info.save') ) ;
// Recreate form so the modified data is instantly shown in the form
$this->createForm (EntityForm::class, $entity ) ;
$this->view = $this->form->createView () ;
}