我有一些表单,如果用户尚未登录,我想在此表单中显示一些附加字段(如电子邮件、用户名)并验证它。
现在我这样做:创建新的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
在创建后以某种方式改变吗?什么是正确的形式事件?谢谢!