Php 请求验证在Symfony中强制执行验证代码重复

Php 请求验证在Symfony中强制执行验证代码重复,php,symfony,symfony4,symfony-validator,Php,Symfony,Symfony4,Symfony Validator,假设我有一个创建用户的RESTAPI方法。我还有一个配置了验证约束的用户实体。问题是如何验证来自请求的数据。我的问题是: 如果事先不验证请求中的数据,我无法填充用户实例-其中一些数据可能丢失,另一些可能无效。例如,null通过string类型提示传递给用户实体的setter 在填充用户实例之前,我不想单独验证请求数据,因为这将重复为用户实体配置的验证约束。在两个位置管理相同或相似的验证约束将是一个问题—控制器和实体验证配置 因此,基本上我希望避免代码和配置中重复验证约束,但同时我必须在填充实体之

假设我有一个创建用户的RESTAPI方法。我还有一个配置了验证约束的用户实体。问题是如何验证来自请求的数据。我的问题是:

  • 如果事先不验证请求中的数据,我无法填充用户实例-其中一些数据可能丢失,另一些可能无效。例如,
    null
    通过
    string
    类型提示传递给用户实体的setter
  • 在填充用户实例之前,我不想单独验证请求数据,因为这将重复为用户实体配置的验证约束。在两个位置管理相同或相似的验证约束将是一个问题—控制器和实体验证配置

  • 因此,基本上我希望避免代码和配置中重复验证约束,但同时我必须在填充实体之前复制它。我怎样才能克服这一点呢?

    这是很正常的

    我的建议是使用DTO,在其中不检查任何限制(基本上,您可以在setter中接受“所有类型的数据”,甚至可以通过使用不那么麻烦的公共属性),并对其进行验证

    当DTO有效时,在有效状态下创建基础对象(值对象?)


    当然,你需要“复制”一些约束,但我不认为这是一个真正的复制,因为实际上,DTO和基础对象不是同一个对象,即使它们看起来是相关的。如果您不同意,也可能是这样,请停下来想想,通过将实体(应始终处于有效状态)与获取用户输入数据的模型分离,您将获得什么样的提升。

    这是非常符合生理的

    我的建议是使用DTO,在其中不检查任何限制(基本上,您可以在setter中接受“所有类型的数据”,甚至可以通过使用不那么麻烦的公共属性),并对其进行验证

    当DTO有效时,在有效状态下创建基础对象(值对象?)


    当然,你需要“复制”一些约束,但我不认为这是一个真正的复制,因为实际上,DTO和基础对象不是同一个对象,即使它们看起来是相关的。如果您不同意,也可能是这样,请停下来想想,通过将实体(应始终处于有效状态)与获取用户输入数据的模型分离,您将获得什么样的提升。

    这是应该做到的,表单中不再有实体。很好。我有一个DTO用于我的服务响应,但我没有想过在输入端使用它。那么您的意思是将请求转换为DTO,然后使用单独描述的约束验证此DTO,然后使用它创建用户实例?@Sergey yes,这基本上就是idea@DonCallisto你是否知道有任何在线指南可以向像我这样的新手展示你的答案。试图获得视觉上的理解。谢谢@klewis是我能记住的唯一资源(即使不是严格意义上的同一主题,而是一个类似的主题),这是应该如何做的,没有更多的实体形式。很好。我有一个DTO用于我的服务响应,但我没有想过在输入端使用它。那么您的意思是将请求转换为DTO,然后使用单独描述的约束验证此DTO,然后使用它创建用户实例?@Sergey yes,这基本上就是idea@DonCallisto你是否知道有任何在线指南可以向像我这样的新手展示你的答案。试图获得视觉上的理解。谢谢@klewis是我能记住的唯一资源(即使不是严格意义上的同一主题,而是一个相似的主题)是