php - Symfony 2.7 表单生成器具有来自另一个实体的新字段?

标签 php symfony doctrine-orm doctrine

所以我从我的数据库布局开始,我有一个 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 详细信息。如果您添加名为 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;
    }
}

关于php - Symfony 2.7 表单生成器具有来自另一个实体的新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33256699/

相关文章:

php - WordPress 将 <span> 移至 <p> 之外

php - Symfony 和 SwiftMailer 使用 starttls 发送

php - 学说一对一关系映射

php - Doctrine ORM 内存问题

php - 获取上周内的 MySQL 数据库条目

php - PHP MYSQL 图像取消链接上的奇怪行为

php - 当需要一行时,laravel eloquent hasmany 关系返回

php - 您的要求无法解析为一组可安装的软件包。使用 Composer

symfony - Assetic Symfony2 less+compress 过滤器

php - 代码点火器学说