1

これはここでの私の最初の質問ですので、間違いを許してください - 次回はそれらを避けるようにします. ;-)

FOSUserBundle のカスタム RegistrationFormType を作成しました。このフォームは、バンドルのデフォルト フィールドに加えて、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 アノテーションの問題でしょうか?

どんなヒントでも大歓迎です!:-)

4

1 に答える 1

0

問題は、データおよび/または教義のマッピングの初期化に起因する可能性があります。

を使用して何も渡されない場合、フォームは data_class を作成し$form->setDataます。フォームを送信してデータをバインドすると$player>setPlayerSkills($playerSkill)、 が呼び出されますが、 $playerSkill->setPlayer($player); は呼び出されません。

oneToOne 関連付けの所有側に応じて、Doctrine がこの関連付けを認識できるように、2 つのメソッドのいずれかを呼び出す必要があります ( 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-双方向)。

次のようになります。

 /**
 * @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;

最後に、ここで説明されているように、逆側を自動的に同期するようにメソッドをコーディングできます。-owning-and-inverse-side .

于 2012-02-11T17:39:05.700 に答える