1

I am using the FOSUserBundle and I extended the registration form to input the name of a company when registering a new user. Company is a separate Entity. I created all required methods for the relation handling.

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

I followed the Symfony guide to embed a Single Object to a form:

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

The registration form is rendered properly; it shows a field for the Company name. But when I submit, I get

Neither the property "company" nor one of the methods "setCompany()", "_set()" or "_call()" exist and have public access in class "Acme\MyBundle\Entity\User".

I obviously neither don't have a company property nor a setCompany() method, because it's a manyToMany relationship, thus I have a companies property and a addCompany() method instead.

Questions

  • Why doesn't Symfony also look for a addCompany() method?
  • Should I implement a setCompany() method (e.g. by simply renaming accordingly, or as a wrapper method which calls addCompany())?
  • Or is this due to the singular/plural problem which comes up when singular and plural method names can't be interpreted correctly by 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 は、ユーザーごとに 1 つの会社のみを作成したいと考えています。

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 フォーム タイプのみをオーバーライドしたい

問題を解決するために、エンティティにセッターを作成するオプションがまだあります。

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

    $this->category->clear();

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

    return $this;
}

注: OneToManyがある場合は、それがコレクションであることを認識できるように、$category の代わりに $categories を使用することエンティティには次のものがあります。

  • $会社
  • getCompanies()
  • setCompanies($会社)
  • addCompany($会社)
  • removeCompany($company)
于 2013-08-28T10:53:21.263 に答える