Old post but interesting question.
How I solved it to check a relation between entities but it also works for a single field value. Easier than dealing with doctrine listeners.
Imagine you have a user with multiple tags and a form with checkboxes to add or remove tags
In the controller, create a new variable that contains the value to monitor :
$oldValue = '';
foreach ( $user->getTags() as $tag )
$oldValue .= $tag->getId().";";
Give it to the formType as an option
$form = $this->get('form.factory')->create(userType::class, $user,
['oldValue' => $oldValue ]);
In the formType, create an hidden field
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,
));
}
Back in the controller get your old field value :
if ( $form->isSubmitted() && $form->isValid() )
{
// Stuff
$em->flush();
// Check changes :
$oldValue = $form->get('oldValue')->getData();
$oldValues = explode(';', $oldValue);
$newValues = $user->getTags();
Compare arrays and finish the stuff...