1

fbid と game_id の両方の組み合わせを一意にしたい。form->isValid() メソッドでテストしたい。しかし、隠し入力でこの値を渡したくありません。

私のエンティティコード:

/**
 * @ORM\Entity
 * @ORM\Table(name="Member",
 *     uniqueConstraints={
 *         @ORM\UniqueConstraint(columns={"fbid", "game_id"})
 *          })
 * @UniqueEntity(fields={"fbid","game"})
 */
class Member
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Game", inversedBy="members")
     * @ORM\JoinColumn(name="game_id", referencedColumnName="id")
     */
    protected $game;

    /**
     * @ORM\Column(type="string")
     */
    private $fbid;

私は試します:

if ($request->getMethod() == 'POST') {
    $form->bind($request);
    $member = $form->getData();
    $member->setGame( $this->game );
    $form->setData($member);
    if ($form->isValid()) {

しかし、私はこの問題を抱えています:

バインドされたフォームのデータは変更できません

4

4 に答える 4

3

Gremoの解決策は良いものですが、1 つのフォーム POST_BIND を処理するためだけにグローバル サービスを作成し、すべての POST_BIND イベントをリッスンするのは得策ではありません。指定されたフォームが作成されたときにのみこのフックを設定する方がはるかに安価です。

これが私の提案ですhttps://gist.github.com/4167466

于 2012-11-29T08:02:14.787 に答える
1

このエラーは、バインド後にフォーム データを変更した場合、isValid() でフォームの有効性を確認できないことを示しています。

なぜバインディングと有効性チェックの間に setGame が必要なのですか?

次のようにリクエストをバインドする前に、関連するゲームを設定する必要があります。

//For creation, you have to initialize a new object
$member = new Member();
$member->setGame( $this->game );

$form = $this->createForm(new FormType(), $member)->getForm();

if ($request->getMethod() == 'POST') {

    $validator = $this->get('validator');
    $errors = $validator->validate($member);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        // persist entity ...
    }

    $form->bind($request);
    if ($form->isValid()) {
于 2012-11-28T17:12:44.230 に答える
0

サービスを作成し、イベントをリッスンしFormEvents::POST_BINDます。チェックするonPostBind()値を取得し、必要に応じてエラーを追加できます。

class AddGameValidation implements EventSubscriberInterface
{   
    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::POST_BIND => 'onPostBind',
        );
    }

    /**
     * @param \Symfony\Component\Form\Event\DataEvent $event
     */
    public function onPostBind(DataEvent $event)
    {
        $form = $event->getForm();

        // Get the data

        if(false === $condition) {
            $form->addError(new FormError('Some message'));
        }
    }
}
于 2012-11-28T17:14:13.280 に答える
0

フォームでイベント サブスクライバーを使用して、おそらく FormEvents::POST_BIND イベントをリッスンすることもできます。イベント サブスクライバーの使用の詳細: http://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html

同様のスタックオーバーフローの質問: Symfony でバインドされたフォーム データを変更するための推奨される場所はどれですか?

于 2012-11-29T10:06:28.713 に答える