Symfony2表单:表单中的自动寄存器块

时间:2012-11-16 07:48:08

标签: symfony

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

现在我这样做: 创建新的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吗?什么是正确的形式事件?谢谢!

1 个答案:

答案 0 :(得分: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服务传递订阅者。在订阅者i中检查POST_BIND事件中的表单验证并执行我的操作。太好了!