php - Symfony2 中的 CollectionType 验证

标签 php forms validation symfony doctrine

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

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

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

两个实体都有自己的 formType,Address 是 User formType 中的 CollectionType。

目前,我在我的用户 Controller 中创建了 3 个正确显示在 View 中的地址。我使用带有“min=2”的“Assert\Count”来验证实体中的表单。在我的 Controller 中,我过滤查询以删除尚未完成的地址,然后验证表单。这种做法是不正确的。如果表格无效,我无法显示 3 个地址,我只有已完成的地址。另外,我用Twig做view的时候出现字段不可用的错误

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

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

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

在用户实体中

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

在用户 Controller 中(当我过滤请求时)

//...

// 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 错误)

关于php - Symfony2 中的 CollectionType 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13165422/

相关文章:

python - 如何在 Pydantic 的严格类型(如 StrictStr)中使用验证器?

javascript - PHP和ajax,防止用户在开发控制台调用函数

PHP/MySql Verbosity VS 线上

php - 数据库名称开头带有破折号的 MySQL 转储

jquery - 通过 event.preventDefault() 阻止表单提交;不工作

javascript - 使用 Abide 进行表单验证

php - 根据经度、纬度、速度和航向计算坐标

java - Tapestry 中的表单编码

html - 2 形式 - 如何布局重叠元素

html - 输入标签中的 "id"是必需的吗?