繁体   English   中英

Symfony2中的CollectionType验证

[英]CollectionType validation in Symfony2

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

我有一个可以包含多个实体地址的用户实体。 User实体的验证应该像这样:

  • 用户必须至少有两个实体地址
  • 用户必须最多有三个实体地址
  • 地址有自己的验证约束

两个实体的formType和Address都是User formType中的CollectionType。

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

理想情况下逻辑如下:地址经过验证,用户只考虑有效地址。 用户检查其验证约束是否受到尊重,然后User实体存储在数据库中。 简单吧? (......那就是我的想法)

您有任何想法或博客文章可以解决我的问题吗?

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

在用户实体中

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

在用户控制器中(当我过滤请求时)

//...

// 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);

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM