0

我有一些表单,如果用户尚未登录,我想在此表单中显示一些附加字段(如电子邮件、用户名)并验证它。

现在我这样做:创建新的FormType

class QuickRegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email')
            ->add('username')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\UserBundle\Entity\User',
            'validation_groups' => array(
                'QuickRegister'
            ),
        ));
    }

    public function getName()
    {
        return 'quick_register';
    }
}

在控制器中:

$user = $this->getUser();

$formBuilder = $this->createFormBuilder($message, array(
    'cascade_validation' => true
));

$formBuilder->add('body', 'textarea');

if (!$user) {
    $formBuilder->add('quick_register', new QuickRegisterType(), array(
        'property_path' => 'sender'
    ));
}

在模板中:

{% if form.quick_register is defined %}
    {# render this fields #}
{% endif %}

就在 $form->bind($request); 之后 我在 $message->getSender() 中获得了有效用户;万事皆安!但我需要在表单验证后执行一些其他操作:

if ($form->isValid()) {
    $sender = $message->getSender();
    if (!$sender->getId()) {
        // perform some work with just registered user
        // like sending email, generate passwords, so on
    }
}

对于所有项目的这种形式,这个动作通常是相同的,所以我想优化它。

起初我认为我可以在 DI 容器中创建新服务并称之为

$this->container->get('my.user_service')->afterQuickRegister($sender);

但现在我在http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html页面上阅读了 symfony2 中的表单事件

我现在不明白,我可以将它用于我的目的吗?我可以在 DI 容器中创建这样的表单订阅者吗?一般来说,我可以User在创建后以某种方式改变吗?什么是正确的形式事件?谢谢!

4

1 回答 1

0

我用 FormEvents 实现它。

form.type.quick_register:
    class: Acme\UserBundle\Form\Type\QuickRegisterType
    arguments: [ @form.type.quick_register.subscriber ]
    tags:
        - { name: form.type, alias: quick_register }

并通过form.type.quick_register.subscriber服务传递订户。在订阅者中,我在 POST_BIND 事件中检查表单验证并做我的事情。伟大的!

于 2012-11-16T14:21:34.497 回答