如果我想为同一个实体提供多个表单,那么更好的解决方案是什么?

时间:2017-08-11 07:34:30

标签: forms symfony

正如我在标题中所说,想象我有一个实体用户,我想为这个实体创建多个表单。

例如,这是我的班级用户:

class User
{
    protected $firstname;
    protected $lastname;
    protected $sex;
    protected $birthdate
    protected $phone;
    protected $email;
    protected $password;
}

现在我想为这个实体创建多个表单:

  • RegisterForm(询问每个字段)
  • ConnexionForm(询问电子邮件+密码)
  • ForgetPasswordForm(询问电子邮件)

我找到了这个解决方案,我想知道这是否是最好的做法:

在我的“FormType”中,我配置了这样的选项:

/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\User',
        'fields' => false,
    ));
}

然后我为我想要的每个字段创建一个循环:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    if($options['fields']){
       foreach($options['fields'] as $field){
                   $builder->add($field);
       }
    } else {
          // Every field I want
    }


}

在我的控制器中,我可以像这样使用它:

$form  = $this->createForm(UserType::class,$user,['fields' => ['email','password', 'other...']);

同样的想法,我也许可以为我的不同形式命名,如果我不在我的“选项”中写一个名字,我会创建“注册”表单,如果我写“connexion”我构建“ Connexion“表格等

你有更好的解决方案,或者这是最好的方法吗?

(我知道你可以用FOSUserBundle来做,但我选择“用户”作为例子)

1 个答案:

答案 0 :(得分:1)

你可以像你写的那样去做。

但我认为更好的解决方案是编写专门的PHP表单类。 比你写的类型要多。但是在Symfony中使用Type word调用表单类:

  • RegisterType(询问每个字段)

  • ConnectionType(询问电子邮件+密码)

  • ForgetPasswordType(询问电子邮件)

这里有最佳实践和Symfony的更多提示(第一段是关于表单): http://symfony.com/doc/2.8/best_practices/forms.html