所以我从我的数据库布局开始,我有一个 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
时对于我的 Twig (在没有 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;
}
}
关于php - Symfony 2.7 表单生成器具有来自另一个实体的新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33256699/