Перекрестная ссылка в форме Symfony2 не работает должным образом - PullRequest
1 голос
/ 11 февраля 2012

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

Я написал специальный RegistrationFormType для 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, что он также добавит ссылку в построителе форм ..? А может это проблема в аннотациях Учения?

Любая подсказка очень ценится! : -)

1 Ответ

0 голосов
/ 11 февраля 2012

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

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

В зависимости от стороны-владельца вашей ассоциации oneToOne, вы должны вызвать один из двух методов, чтобы Doctrine было известно об этой ассоциации (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 # двунаправленный ).

Это должно быть примерно так:

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

То же самое для класса 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 # Выбор-владение-и-обратная сторона .

...