使用Listener

时间:2018-06-19 10:30:25

标签: symfony

我正在使用Symfony 3.4并且我有一个奇怪的事情,我将尝试清楚地解释。

我有一个实体Website和一个WebsiteFormType,在此WebsiteFormType我有一个类似的监听器:(在formType的buildForm()的第一行)

$builder->addEventSubscriber(new WebsiteListener();

在这个监听器中,我需要在提交表单时检查何时更新特定值,如果更新了此值,我需要复制我的对象,例如当我更新我的网站并更改{{ 1}}从urlhttp://xxx.xx我复制了我的第一个网站以创建第二个网站,而不是仅仅更新字段http://yyyy.yy

在此监听器中,我使用urlpreSubmit

我的问题是,当我更改网址时,我需要更改链接到表单的对象网站。

如果postSubmit是WebsiteA且http://xxx.xx是WebsiteB,当我提交WebsiteA并更改网址时,我需要将链接到表单的网站对象从WebsiteA更改为WebsiteB .... / p>

如果我在此之后重新验证表单,那么它是经过验证的WebsiteB,而不是WebsiteA。

不知道你是否理解我的问题:)谢谢!

1 个答案:

答案 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)
    }
}
}