Php symfony隐藏字段,但对其进行验证

Php symfony隐藏字段,但对其进行验证,php,forms,symfony,entity,Php,Forms,Symfony,Entity,我的一个实体有一个奇怪的问题 my Vehicle实体具有以下db表字段: 订单(主键) 牌照(PK) 制造 模型 变体 在表单上,唯一可见的字段是licenseplate 字段后面有一个按钮,访问者从ajax调用中获取make/model/variant数据到AjaxController,AjaxController将数据添加到数据库中。(有一个$session'orderId'设置'orders'字段) 我需要绝对确定访问者已经获取了make/model/variant,并且访问者不能更

我的一个实体有一个奇怪的问题

my Vehicle实体具有以下db表字段:

  • 订单(主键)
  • 牌照(PK)
  • 制造
  • 模型
  • 变体
在表单上,唯一可见的字段是licenseplate

字段后面有一个按钮,访问者从ajax调用中获取make/model/variant数据到AjaxController,AjaxController将数据添加到数据库中。(有一个$session'orderId'设置'orders'字段)

我需要绝对确定访问者已经获取了make/model/variant,并且访问者不能更改make/model/variant数据

如何在提交表格上检查车辆表是否已填写?我可以进行条令检查并将表单设置为“无效”吗

谢谢你抽出时间

在这方面,Lars Hansen的一种方法是:

  • 从表单中删除品牌、型号和变体。如果您不希望用户可能更改它们,而您正在将它们保存到其他位置,那么使用它们是没有意义的
  • 在表单中添加一个隐藏的、未映射的字段,类似于“dataFetched”
  • 当通过ajax成功获取/保存汽车数据时,请将此字段设置为checked/true
  • 通过javascript,在选中dataFetched字段之前不允许表单提交
  • 在PRE_SUBMIT侦听器中,检查dataFetched是否为true,如果不是,则使表单无效(因为JS检查本身是不够的)。有关侦听器示例,请参见symfony标准包中的CsrfValidationListener。(我正在使用2.3,但我认为它在新版本中仍然存在)
  • 如果希望在表单中保留make/model/variant,可以选择。在侦听器中,您还可以检查make/model/variant 与您期望的一致(如果用户更改 it)&此时使表单无效

  • 为什么不获取ajax数据并填充表单的隐藏字段,并在提交时包含这些数据?这样,您就可以使用标准验证使字段成为必需(但隐藏)字段。此外,如果用户必须选择make/model/variant,为什么字段会隐藏?他们不想看到他们选择了什么吗?Hi@Richard-字段不在中,因为用户可能无法更改值。我的ajax调用以字符串形式返回make/model/variant,以便用户可以看到它是正确的汽车。但是我想确保用户不会更改make/model/variant值,所以我将它们保存在ajax调用中。但同时,我想确保表单submit中的用户已经获取了汽车数据。这有意义吗?有很多方法可以做到这一点,我已经在脑海中添加了一个答案。我如何在监听器中检查make/model/variant?据我所知,该学说在“实体类型”中不可用?它可以被注入吗?是的,您可以将doctrine/entitymanager注入到表单类型中(并扩展到侦听器),没有问题。您可以直接将其作为构造函数参数来执行,也可以将表单类型定义为服务并以这种方式注入entitymanager。侦听器本身也可以访问表单中的底层实体对象。嗨@Richard-我接受了你的答案-你有任何注入工作的例子吗?我昨天一整天都在谷歌上搜索,一点运气都没有。谢谢你抽出时间!你好表单即服务(允许DI):-表单的实体侦听器:-应该是您需要的所有内容。