相关实体的 Valdiator

Valdiator for related entites

提问人:endo.anaconda 提问时间:10/28/2023 更新时间:10/29/2023 访问量:40

问:

我有两个实体,我希望有一个自定义验证器约束,以确保两个实体共享一个值。

例:

实体区域:

  • 有田野城
  • 具有多个房屋作为一对多关系
  • 仅允许具有相同城市的房屋的约束

实体之家:

  • 有田野城
  • 具有一个区域作为 ManyToOne 关系

非常感谢您回答有关如何实现这一目标的任何提示。

symfony(英语:symfony) 验证 约束 symfony6 (英语)

评论

0赞 Adam Richard 10/29/2023
由于您的众议院实体与某个区域有关系,因此您的众议院实体似乎没有任何理由需要城市字段。这将解决您的问题,而无需验证房屋所在的城市是否与该地区匹配。
0赞 endo.anaconda 10/29/2023
这只是一个简化,实际情况有点困难。基本上,我搜索一个查找其他实体的验证器

答:

1赞 Skuti 10/29/2023 #1

以下是实现您想要执行的操作的解决方案:

在 FormType 中,在 PRE_SUBMIT 上添加一个事件侦听器,并添加约束,如下所示:

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Validator\Constraints\EqualTo;

// ...

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
    $data = $event->getData();
    $form = $event->getForm();

    if (isset($data['cityA'])) {
        $form->add('cityB', TextType::class, [
            'constraints' => [
                new EqualTo([
                    'value' => $data['cityA'],
                    'message' => 'Must be the same as cityA',
                ]),
            ],
        ]);
    }

    // Here other constraints
});