1

我正在使用FOSUserBundle,并在注册新用户时扩展了注册表以输入公司名称。Company是一个单独的实体。我为关系处理创建了所有必需的方法。

/**
 * User entity
 */
class User {
    // ...
    addCompany() { /* ... */ }
    removeCompany() { /* ... */ }
    getCompanies() { /* ... */ }
}

我按照Symfony 指南将单个对象嵌入到表单中

class RegistrationFormType extends \FOS\UserBundle\Form\Type\RegistrationFormType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('...')
            ->add('company', new CompanyType());
    }
    // ...
}

注册表正确呈现;它显示了公司名称的字段。但是当我提交时,我得到

属性“company”和方法“setCompany()”、“_ set()”或“ _call()”都不存在,并且在类“Acme\MyBundle\Entity\User”中具有公共访问权限。

我显然既没有company属性也没有setCompany()方法,因为它是多对多关系,因此我有一个companies属性和一个addCompany()方法。

问题

  • 为什么 Symfony 也不寻找addCompany()方法?
  • 我应该实现一个setCompany()方法(例如通过简单地重命名,或者作为调用的包装方法addCompany())?
  • 或者这是由于 Symfony 无法正确解释单数和复数方法名称时出现的单数/复数问题?
4

1 回答 1

3

你所追求的是by_reference选择。

有2种情况:

  1. by_reference => true因此设置器被调用(默认情况下)。

  2. by_reference => false因此调用了加法器。

你想要做的正是这个: 

如何嵌入表单集合


编辑1:OP希望用户加法器而不是设置器

尝试这个:

$builder->add('company', 'collection', array(
    'type'   => new CompanyType(),
    'options'  => array(
        'by_reference'  => false,
    ),
));

编辑 2:OP 希望每个用户只创建一家公司

class UserController extends Controller
{
    public function whateverAction(Request $request)
    {
        $user = new User();

        $company = new Company();
        $user->getCompany()->add($company);

        $form = $this->createForm(new UserType(), $user);

        $form->handleRequest($request);

        if ($form->isValid()) {
            // form processing
        }

        return $this->render('AcmeUserBundle:User:new.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

编辑 3:OP 只想覆盖 FOSUserBundle 表单类型

您仍然可以选择在您的实体中创建一个 setter 来解决您的问题。

/**
 * Set Category
 *
 * @param ArrayCollection $category
 */
public function setCategory($category) {

    $this->category->clear();

    foreach ($category as $cat) {
        $this->addCategory($cat);
    }

    return $this;
}

注意:如果您有OneToMany ,最好使用 $categories 而不是 $category ,这样您就知道它是一个集合。您将在您的实体中拥有:

  • $公司
  • 获取公司()
  • 设置公司($公司)
  • 添加公司($公司)
  • 删除公司($公司)
于 2013-08-28T10:53:21.263 回答