所以我从我的数据库布局开始,我有一个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
详细信息的表单。如果您添加一个名为companyname
的AccountType
属性,表单组件希望您提供这些方法:
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;
}
}