シンフォニーのバージョン: 2.8.5
コンテキスト:座標情報に関連する他のエンティティと複数の関係を持つエンティティRestaurant
と OneToOne 関係を持つエンティティがあります。Coordinates
私は私のバックエンドに関連Restaurant
するカスタムネストされたフォームを持つエンティティに関連するフォームを作成しCoordinates
ます。
注意 : 私はEasyAdminBundleを使用してバックエンドを生成しています。
エンティティ関係スキーム:
Restaurant
1 ________ 1 `Coordinates`
* ________ 1 `CoordinatesCountry`
1 ________ 1 `CoordinatesFR`
* ________ 1 `CoordinatesFRLane`
* ________ 1 `CoordinatesFRCity`
バックエンド ビュー:
この時点で、次のシナリオを試します。
- 新しいレストランを作成するので、初めてフォームに関連するフィールドに入力します。
Coordinates
ネストされたフォームを空白 (空のフィールド) にします。したがって、フォームの送信後、検証メッセージが表示されます (下の画像を参照)。
以前のフォームを編集し、今回は
Coordinates
ネストされたフォームのフィールドに入力します。フォームの送信後、新しいエンティティがハイドレートされ、とCoordinates
の間に関係が作成されます。Restaurant
Coordinates
もう一度前のフォームを編集し、今度は
Coordinates
ネストされたフォームのすべてのフィールドをクリアします。検証がトリガーされず、次のエラーが発生します。
タイプ「FBN\GuideBundle\Entity\CoordinatesFRCity」の予期される引数、「NULL」が指定されました
空のデータ(すべてのフィールドが空白) の場合に新しいインスタンスを開始するために、(公式ドキュメントで説明されているように) クロージャーCoordinatesFRType
を使用してオプションを初めて使用しなければならなかったときに検証メッセージをトリガーするために、(以下のコードを参照) でそれを正確に説明します。 . しかし、この記事 (Symfony フォーム コンポーネントの作成者によって書かれた) では、はオブジェクトの作成時にのみ呼び出されることが説明されています (empty_data および datta マッパーの段落を参照) 。これが、エディションの場合に検証が機能しなくなった理由だと思います。empty_data
CoordinatesFR
empty_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();
},
));
}
}