Установка данных с помощью прослушивателя событий и события FormEvent::PRE_SET_DATA в Symfony2

Я пытаюсь изменить некоторые данные в форме, основанной на других данных в форме. Из документов:

Событие FormEvents::PRE_SET_DATA отправляется в начале метода Form::setData(). Может использоваться для:

  • Изменить данные, приведенные во время предварительного населения
  • Изменить форму в зависимости от предварительно заполненных данных (динамическое добавление или удаление полей).

Эта жирная линия заставила меня поверить, что в моем случае должно быть возможно сделать что-то вроде следующего buildForm функция:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SET_DATA,
        function(\Symfony\Component\Form\FormEvent $event) use ($options) {
            if ($options['default_to_nickname']) {
                $securityContext = $this->container->get('security.context');
                $nickname = null;
                if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
                    $user = $securityContext->getToken()->getUser();
                    $nickname = $user->getNickName();
                    if (isset($nickname))
                    {
                        $options['data'] = $nickname;
                        //$event->setData($nickname); //this doesn't work either
                    }
                }
            }
        }
    );
}

Тем не менее, ни options['data'] = $nickname; ни $event->setData($nickname); в результате заполнить форму правильными данными. Я вижу, что данные устанавливаются в объекте FormEvent при вызове $event->setData($nickname);, но когда форма действительно отображается, данные не были установлены. Я ожидаю что-то не то? Я изучил, может ли что-то еще изменить это после этого, и нет. Любая помощь будет приветствоваться!

1 ответ

Вы должны позвонить $event->getForm()->get('your_property')->setData($nickname), замещать get() метод по add($property, $type, ['data' => $nickname]) если свойство еще не существует.

Смотрите: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

Другие вопросы по тегам