我正在使用Symfony 3.4并且我有一个奇怪的事情,我将尝试清楚地解释。
我有一个实体Website
和一个WebsiteFormType
,在此WebsiteFormType
我有一个类似的监听器:(在formType的buildForm()
的第一行)
$builder->addEventSubscriber(new WebsiteListener();
在这个监听器中,我需要在提交表单时检查何时更新特定值,如果更新了此值,我需要复制我的对象,例如当我更新我的网站并更改{{ 1}}从url
到http://xxx.xx
我复制了我的第一个网站以创建第二个网站,而不是仅仅更新字段http://yyyy.yy
。
在此监听器中,我使用url
和preSubmit
。
我的问题是,当我更改网址时,我需要更改链接到表单的对象网站。
如果postSubmit
是WebsiteA且http://xxx.xx
是WebsiteB,当我提交WebsiteA并更改网址时,我需要将链接到表单的网站对象从WebsiteA更改为WebsiteB .... / p>
如果我在此之后重新验证表单,那么它是经过验证的WebsiteB,而不是WebsiteA。
不知道你是否理解我的问题:)谢谢!
答案 0 :(得分:0)
尝试使用 Doctrine EventSubscriber ,例如:
class OrderListener implements EventSubscriber {
protected $statusChanges = false;
public function getSubscribedEvents()
{
return array(
'preUpdate',
'postUpdate',
);
}
public function preUpdate(PreUpdateEventArgs $args)
{
$changeSet = $args->getEntityChangeSet();
foreach ($changeSet as $key => $arr) {
if ($key === 'status' && (int)$arr[0] !== (int)$arr[1]) {
$this->statusChanges = true;
}
}
}
public function postUpdate(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if ($entity instanceof Order && $this->statusChanges) {
$repo = $args->getObjectManager()->getRepository(Action::class);
$action = new Action();
$action->setOrder($entity)
->setStatus($entity->getStatus())
->setCost($entity->getCost())
->setTimeAt(new \DateTime())
->setPoint($entity->getPoint())
->setDescription($entity->getDescription())
->setService($entity->getService())
;
$repo->persistAndFlush($action); // custom method, you can use $args->getObjectManager()->persist($action) and $args->getObjectManager()->flush($action)
}
}
}