2

シンフォニーのバージョン: 2.8.5

コンテキスト:座標情報に関連する他のエンティティと複数の関係を持つエンティティRestaurantと OneToOne 関係を持つエンティティがあります。Coordinates私は私のバックエンドに関連Restaurantするカスタムネストされたフォームを持つエンティティに関連するフォームを作成しCoordinatesます。

注意 : 私はEasyAdminBundleを使用してバックエンドを生成しています。

エンティティ関係スキーム:

Restaurant

  1 ________ 1 `Coordinates`
                    * ________ 1 `CoordinatesCountry`
                    1 ________ 1 `CoordinatesFR`
                                      * ________ 1 `CoordinatesFRLane`
                                      * ________ 1 `CoordinatesFRCity`

バックエンド ビュー:

ここに画像の説明を入力

この時点で、次のシナリオを試します。

  1. 新しいレストランを作成するので、初めてフォームに関連するフィールドに入力します。Coordinatesネストされたフォームを空白 (空のフィールド) にします。したがって、フォームの送信後、検証メッセージが表示されます (下の画像を参照)。

ここに画像の説明を入力

  1. 以前のフォームを編集し、今回はCoordinatesネストされたフォームのフィールドに入力します。フォームの送信後、新しいエンティティがハイドレートされ、とCoordinatesの間に関係が作成されます。RestaurantCoordinates

  2. もう一度前のフォームを編集し、今度はCoordinatesネストされたフォームのすべてのフィールドをクリアします。検証がトリガーされず、次のエラーが発生します。

タイプ「FBN\GuideBundle\Entity\CoordinatesFRCity」の予期される引数、「NULL」が指定されました

空のデータ(すべてのフィールドが空白) の場合に新しいインスタンスを開始するために、(公式ドキュメントで説明されているように) クロージャーCoordinatesFRTypeを使用してオプションを初めて使用しなければならなかったときに検証メッセージをトリガーするために、(以下のコードを参照) でそれを正確に説明します。 . しかし、この記事 (Symfony フォーム コンポーネントの作成者によって書かれ) では、はオブジェクトの作成時にのみ呼び出されることが説明されています (empty_data および datta マッパーの段落を参照) 。これが、エディションの場合に検証が機能しなくなった理由だと思います。empty_dataCoordinatesFRempty_data

質問: フォームを編集してすべての埋め込みフォームをクリアすると、検証が有効にならないのはなぜですか?

コード(必要なもののみ):

レストラン事業体

use Symfony\Component\Validator\Constraints as Assert;

class Restaurant
{
    /**
     * @ORM\OneToOne(targetEntity="FBN\GuideBundle\Entity\Coordinates", inversedBy="restaurant", cascade={"persist"})
     * @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
     * @Assert\Valid()
     */
    private $coordinates;
}

座標エンティティ

use Symfony\Component\Validator\Constraints as Assert;

class Coordinates
{
    /**
     * @ORM\ManyToOne(targetEntity="FBN\GuideBundle\Entity\CoordinatesCountry")
     * @ORM\JoinColumn(nullable=false)
     */
    private $coordinatesCountry;

    /**
     * @ORM\OneToOne(targetEntity="FBN\GuideBundle\Entity\CoordinatesFR", inversedBy="coordinates", cascade={"persist"})
     * @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
     * @Assert\Valid()
     */
    private $coordinatesFR;

    /**
     * @ORM\OneToOne(targetEntity="FBN\GuideBundle\Entity\Restaurant", mappedBy="coordinates")
     * @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
     */
    private $restaurant;
}

座標FRエンティティ

use Symfony\Component\Validator\Constraints as Assert;

class CoordinatesFR extends CoordinatesISO
{
    /**
    * @ORM\ManyToOne(targetEntity="FBN\GuideBundle\Entity\CoordinatesFRLane")
    * @ORM\JoinColumn(nullable=true)
    * @Assert\NotBlank()
    */
   private $coordinatesFRLane;

   /**
    * @ORM\ManyToOne(targetEntity="FBN\GuideBundle\Entity\CoordinatesFRCity")
    * @ORM\JoinColumn(nullable=false)
    * @Assert\NotBlank()
    */
   private $coordinatesFRCity;

    /**
     * @ORM\OneToOne(targetEntity="FBN\GuideBundle\Entity\Coordinates", mappedBy="coordinatesFR")
     * @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
     */
    private $coordinates;
}

Easy Admin config (RestaurantType に相当)

easy_admin:
    entities:
        Restaurant:
            class : FBN\GuideBundle\Entity\Restaurant
            form:
                fields:
                    - { property: 'coordinates', type: 'FBN\GuideBundle\Form\CoordinatesType' }

座標タイプ

class CoordinatesType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('CoordinatesCountry', EntityType::class, array(
                'class' => 'FBNGuideBundle:CoordinatesCountry',
                'property' => 'country',
                ))
            ->add('coordinatesFR', CoordinatesFRType::class)
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FBN\GuideBundle\Entity\Coordinates',
        ));
    }
}

座標FRタイプ

class CoordinatesFRType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('laneNum', TextType::class)
            ->add('coordinatesFRLane', EntityType::class, array(
                'class' => 'FBNGuideBundle:CoordinatesFRLane',
                'property' => 'lane',
                'placeholder' => 'label.form.empty_value',
                ))
            ->add('laneName', TextType::class)
            ->add('miscellaneous', TextType::class)
            ->add('locality', TextType::class)
            ->add('metro', TextType::class)
            ->add('coordinatesFRCity', EntityType::class, array(
                'class' => 'FBNGuideBundle:CoordinatesFRCity',
                'property' => 'display',
                'query_builder' => function (CoordinatesFRCityRepository $repo) {
                    return $repo->getAscendingSortedCitiesQueryBuilder();
                    },
                'placeholder' => 'label.form.empty_value',
                ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FBN\GuideBundle\Entity\CoordinatesFR',
            // Ensures that validation error messages will be correctly displayed next to each field 
            // of the corresponding nested form (i.e if submission and CoordinatesFR nested form with all fields empty)
            'empty_data' => function (FormInterface $form) {
                return new CoordFR();
            },
        ));
    }
}
4

0 に答える 0