我有一些表单,如果用户尚未登录,我想在此表单中显示一些其他字段(如电子邮件,用户名)并进行验证。
现在我这样做:
创建新的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
吗?什么是正确的形式事件?谢谢!
答案 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事件中的表单验证并执行我的操作。太好了!