检查哪个表单字段值已更改 Symfony 3

Checking which form field value has changed Symfony 3

我需要在 FormType 内部检查哪个字段已更改。有什么方法可以做到吗?我搜索了一段时间,然后尝试以几种方式(也使用表单事件)获取编辑的实体字段以捕获编辑的字段,但没有简单的结果。

有没有什么方法可以轻松做到,或者我需要更有创意地制作这样的东西?最好是,如果我能得到一个实体类型的例子,但任何线索都会很棒。

P.S。我不能在客户端执行 - 由于特殊原因我必须在服务器端执行。

完成:

假设我们要检查 ImportantObject 中的 "status" 字段,代码需要看起来像那样

if($form->isSubmitted() && $form->isValid())
{
        $uow = $em->getUnitOfWork();
        $uow->computeChangeSets();
        $changeSet = $uow->getEntityChangeSet($importantObject);

        if(isset($changeSet['status'])){
          //do something with that knowledge
        }
}

老 post 但有趣的问题。

我如何解决它以检查实体之间的关系,但它也适用于单个字段值。比对付学说听众更容易。

假设您有一个具有多个标签的用户和一个带有用于添加或删除标签的复选框的表单

在控制器中,创建一个包含要监视的值的新变量:

$oldValue = '';
foreach ( $user->getTags() as $tag )
  $oldValue .= $tag->getId().";";

将其作为选项提供给 formType

$form = $this->get('form.factory')->create(userType::class, $user,
      ['oldValue' => $oldValue ]);

在formType中,创建一个隐藏字段

use Symfony\Component\Form\Extension\Core\Type\HiddenType;

public function buildForm(FormBuilderInterface $builder, array $options)
    ....
    $oldValue = $options['oldValue'];
    $builder         
      ->add('oldValue', HiddenType::class, [
          'data'          => $oldValue,
          'mapped'        => false,
      ]);

...

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class'        => 'pathToEntity',          
        'oldValue'          => null,
    ));
}

返回控制器获取您的旧字段值:

if ( $form->isSubmitted() && $form->isValid() )
{
  // Stuff
  $em->flush();
  //  Check changes :
  $oldValue = $form->get('oldValue')->getData();
  $oldValues = explode(';', $oldValue);
  $newValues = $user->getTags();

比较数组并完成这些东西...