Php Symfony2中的CollectionType验证

Php Symfony2中的CollectionType验证,php,forms,validation,symfony,doctrine,Php,Forms,Validation,Symfony,Doctrine,我花了很多时间来寻找这个问题的解决方案,但我没有找到正确的解决方案 我有一个可以包含多个实体地址的用户实体。用户实体的验证应如下所示: 用户必须至少有两个地址实体 用户最多必须有三个实体地址 地址有自己的验证约束 这两个实体都有其formType,并且地址是用户formType中的CollectionType 目前,我在我的用户控制器中创建了3个在视图中正确显示的地址。我使用'Assert\Count'和'min=2'来验证实体中的表单。在我的控制器中,我过滤查询以删除尚未完成的地址,然后验

我花了很多时间来寻找这个问题的解决方案,但我没有找到正确的解决方案

我有一个可以包含多个实体地址的用户实体。用户实体的验证应如下所示:

  • 用户必须至少有两个地址实体
  • 用户最多必须有三个实体地址
  • 地址有自己的验证约束
这两个实体都有其formType,并且地址是用户formType中的CollectionType

目前,我在我的用户控制器中创建了3个在视图中正确显示的地址。我使用'Assert\Count'和'min=2'来验证实体中的表单。在我的控制器中,我过滤查询以删除尚未完成的地址,然后验证表单。这种做法是不正确的。我无法显示3个地址如果表格无效,我只有已填写的地址。此外,在我创建时,字段中没有可用的错误​​有树枝的景色

理想情况下,逻辑如下:验证地址,用户只考虑有效地址。用户检查其验证约束是否得到遵守,然后将用户实体存储在数据库中。很简单,对吧?(…我就是这么想的)

你有什么想法或博客文章来解决我的问题吗

编辑(回答评论中的问题)

在用户实体中

<?php
//...
* @Assert\Count(
*      min=2,
*      minMessage="user_form_not_enough_addresses",
*      max=3,
*      maxMessage="user_form_too_much_addresses"
* )
*/
private $addresses;
//...

经过一些研究,唯一可接受的解决方案是使用Symfony事件

我们必须区分两部分:验证和数据记录。在这两部分中,您必须使用验证器验证地址,并根据发现的错误执行某些操作

在验证的情况下,您必须复制文件validation
ValidationListener.php
,然后使用服务匹配您的文件。然后简单地定制验证机制。目标是只显示无效但为必填或非必填的地址,但某些字段已填充,只需搜索不同的情况,并在显示错误时使用
ViolationMapperInterface::mapViolation()


在数据记录的情况下,只需过滤无效地址,以确保信条不考虑这些地址(否则会导致SQL错误)

是否可以显示带有Assert\Count的字段和用于“过滤”查询的代码
//...

// Removing not completed addresses from request
$this->_filterRequest($request);

$userType = new UserType();
$user = new User();

$userForm = $request->get($userType->getName());
foreach ($userForm['addresses'] as $address) {
    $user->getAddresses()->add(new Address());
}

$form = $this->createForm($userType, $user);
$form->bind($request);