Symfony2根据Model类验证提交的数据

时间:2016-10-22 23:06:47

标签: php validation symfony

我尝试针对现有的模型/实体/ POPO验证提交的数据,但我无法以任何简单的方式使其工作。

所有这一切都发生在控制器动作中。

所以,我可以这样做:

    $constraints = new Assert\Collection([
        'username' => [new Assert\NotBlank()],
        'email' => [new Assert\Email()],
    ]);
    $violationList = $this->get('validator')->validate($request->request->all(), $constraints);

然而,在每个动作中这样做都没有意义,因为在一个类中拥有所有约束会更好。因此,验证组件允许这样做:

// All constraints are defined inside Customer class
$customer = new Customer();
$violationList = $this->get('validator')->validate($customer);

违规列表现在充满了错误,因为$ customer是一个空对象,但问题是我无法找到一种方法来使用POST中的数据并根据类中定义的约束来验证它。 / p>

可以编写额外的组件/帮助程序来获取POST数据,然后调用->setUsername()->setEmail()等等,但考虑到你可以做到这一点似乎并不正确轻松将模型映射到POST数据,如果:

  • 涉及表单组件;
  • 手动使用ConstraintsCollection;

我是否遗漏了一些明显的东西,或者没有开箱即用的可能性?谢谢!

1 个答案:

答案 0 :(得分:1)

AFAIK表单组件是负责将发布数据映射到您的实体的组件。所以你有两个选择

  1. 使用表格,您将对数据进行映射并验证模型
  2. 跳过表单,但您必须手动将请求参数映射到您的实体。然后使用$this->get('validator')->validate($customer);
  3. 验证您的模型

    修改:

    表单角色是将来自请求(html表单,api ....)的数据映射到模型。验证可以使用或不使用它作为执行工作的validator组件,应该注意验证是在模型而不是表单上完成的。

    如果你想跳过表单,请检查这个问题:Populate entity from data array without form/request虽然表单组件非常有用,特别是如果你在很多地方使用相同的逻辑(创建/编辑..)