Symfony 2.7表单生成器与新的字段从另一个实体


Symfony 2.7 form builder with new field from another entity?

所以我从我的数据库布局开始,我有一个User表,它有一个accounts_id链接到另一个表Accounts

Accounts里面我有companyname。现在,我已经为我的用户注册构建了一个AbstractType。我希望这个表单包括companyname字段。但是我所尝试的是不工作,所以哪里是我所做的到目前为止,

use XBundle'Form'AccountType;
class UserType extends AbstractType {
  public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('firstname', 'text',['label'=>'Firstname'])
            ->add('surname', 'text',['label'=>'Surname'])
            //->add('companyname','text', ['data_class' => 'XBundle'Entity'Accounts'])
            ->add('companyname', new AccountType()) <- current attempt
            ->add('email', 'email',['label'=>'Email'])
            ->add('password', 'password',['label'=>'Password']);
            //->add('confirm', 'password', ['mapped' => false,'label'=>'Re-type password'])
            //->add('homepage', 'text',['label'=>'Homepage'])
            //->add('save', 'submit', ['label'=>'Register']);
  }
  public function getName() {
      return 'registration';
  }
  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
        'data_class' => 'XBundle'Entity'Users',
        'cascade_validation' => true,
    ]);
  }
}

对于我的AccountType,我有以下内容,

class AccountType extends AbstractType {
  public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('companyname','text', ['label'=>'Company']);       
  }
  public function getName() {
    return 'account';
  }
  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
        'data_class' => 'XBundle'Entity'Accounts',
    ]);
  }
}

当我为我的树枝构建一个createForm & createView(没有companyname / AccountType渲染没有任何问题)。我得到以下错误,

Neither the property "companyname" 
nor one of the methods "getCompanyname()", 
"companyname()", "isCompanyname()", "hasCompanyname()", 
"__get()" exist and have public access in class "XBundle'Entity'Users"

现在我知道companyname在我的Accounts Entity。我还做了一个测试,以确保我的AccountType工作,通过构建具有该类型的新表单,它呈现Company Name字段没有任何问题。

但我不确定我做错了什么,或者即使这是关于在我的用户注册表单上添加另一个实体字段的正确方式,请帮助:)

您得到的错误是预期的。

AccountType是编辑Account实体详细信息的表单。通过将companyname添加到构建器中,您可以显式地表示存在该属性的setter和getter。这部分是正确的。

UserType是编辑User实体详细信息的表单,不是编辑Account详细信息的表单。如果您添加一个名为companynameAccountType属性,表单组件希望您提供这些方法:

public function getCompanyname() {/*...*/}
public function setCompanyname(Account $account) {/*...*/}

这不是你所期望的,而正是错误所说的。

您需要为您的用户实体提供Account的访问器,然后定义表单应该如何处理它。

选项1:您想要选择一个现有的帐户

将此添加到UserType构建器中:

public function buildForm(FormBuilderInterface $builder, array $options) {
    // options are guessed anyway, you choose if set it explicitly or not
    $builder->add('account'/*, 'entity', array(
        'class' => 'XBundle:Account'
    )*/);
}

和以下的User实体:

class User {
    private $account;
    public function getAccount() {
        return $this->account;
    }
    public function setAccount(Account $account /* = null, if optional */) {
        $this->account = $account;
    }
}

选项2:你想要一对一的关联和一个可编辑的帐户

将此添加到UserType构建器:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('account', new AccountType());
}

和以下的User实体:

class User {
    private $account;
    public function __construct() {
        $this->account = new Account();
    }
    public function getAccount() {
        return $this->account;
    }
}