【问题标题】:Symfony2 Validating submitted data against Model classSymfony2 根据模型类验证提交的数据
【发布时间】:2016-10-22 23:06:47
【问题描述】:

我正在尝试根据现有模型/实体/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 的数据并根据类中定义的约束对其进行验证的方法。

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

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

我在这里遗漏了一些明显的东西还是没有开箱即用的可能性?谢谢!

【问题讨论】:

    标签: php validation symfony


    【解决方案1】:

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

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

    编辑:

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

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

    【讨论】:

    • 是的,我在这里尽量避免使用表单组件。数据不是来自 html 表单,所以对我来说,FormComponent 的使用似乎对所有字段及其类型定义过度。除此之外,每个工具/组件都应该是
    • 对不起,对于双重发布 - 不幸的是我无法编辑我的 cmets,所以我会重复一下......除此之外,每个工具/组件都有其特定的用途,所以使用 Form 仅仅为了做验证是不对的。 Validator 已经支持->validate($dataToValidate, $constraints); 的语法,因此能够对模型类执行相同的操作似乎是合乎逻辑的,尤其是在通常支持验证模型类的情况下。
    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多