2012-02-11 6 views
1

Это мой первый вопрос здесь, поэтому, пожалуйста, извините за любые ошибки - я постараюсь избежать их в следующий раз. ;-)Перекрестная ссылка в форме Symfony2 не работает должным образом

Я написал собственный тип RegisterFormType для FOSUserBundle. Эта форма обрабатывает - помимо полей по умолчанию пакета - PlayerType. Этот сам PlayerType снова содержит PlayerSkillsType. Вот классы:

class RegistrationFormType extends BaseType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     $builder->add('player', new PlayerType()); 
    } 

    public function getName() 
    { 
     return 'signup_form'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Acme\AcmeBundle\Entity\User', 
     ); 
    } 
} 

class PlayerType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('firstname'); 
     $builder->add('lastname'); 
     $builder->add('age'); 
     $builder->add('playerSkills', new PlayerSkillsType()); 
    } 

    public function getName() 
    { 
     return 'player_form'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Acme\AcmeBundle\Entity\Player', 
     ); 
    } 
} 

class PlayerSkillsType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('tackling'); 
     $builder->add('passing'); 
     $builder->add('shooting'); 
    } 

    public function getName() 
    { 
     return 'playerSkills_form'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Acme\AcmeBundle\Entity\PlayerSkills', 
     ); 
    } 
} 

/** 
* @ORM\Entity 
*/ 
class Player 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="PlayerSkills", cascade={"persist"}) 
    * 
    * @var PlayerSkills 
    */ 
    private $playerSkills; 
} 

/** 
* @ORM\Entity 
*/ 
class PlayerSkills 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="Player", cascade={"persist"}) 
    * 
    * @var Player 
    */ 
    private $player; 
} 

(. Я оставил из добытчиков и сеттер и несущественные свойства и методы) Это работает отлично до сих пор, форма проявляется и сохраняется. Теперь моя проблема заключается в том, что после сохранения данных в объекте PlayerSkills в данных отсутствует ссылка на объект Player.

Я думаю, что это то, что мне нужно сообщить PlayerSkillsType, что он также добавит ссылку в построитель форм ..? Или, может быть, это проблема в аннотациях Doctrine?

Подсказка очень ценится! :-)

ответ

0

Проблема может возникнуть в результате инициализации ваших данных и/или сопоставления доктрины.

Форма будет создавать data_class, если ни один не передан с использованием $form->setData. Когда вы отправляете форму и связываете данные, она будет вызывать $player>setPlayerSkills($playerSkill), , но она не будет вызывать $ playerSkill-> setPlayer ($ player);

В зависимости от вашей стороны вашей ассоциации oneToOne вы должны вызвать один из двух методов, чтобы доктрина была осведомлена об этой ассоциации (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html#owning-side-and-inverse-side).

Попробуйте изменить отображение аннотаций в PlayerSkills, чтобы ввести информацию inversedBy также (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html#one-to-one-bidirectional).

Это должно быть что-то вроде этого:

/** 
* @ORM\OneToOne(targetEntity="Player", mappedBy="playerSkills", cascade={"persist"}) 
* 
* @var Player 
*/ 
private $player; 

То же самое для класса игрока:

/** 
* @ORM\OneToOne(targetEntity="PlayerSkills", inversedBy="player" cascade={"persist"}) 
* 
* @var PlayerSkills 
*/ 
private $playerSkills; 

Наконец, вы можете кодировать свои методы, чтобы автоматически синхронизировать обратную сторону, как описано здесь: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html#picking-owning-and-inverse-side ,

+0

Большое вам спасибо! Вы сделали мой день! ;-) –

Смежные вопросы