Zend framework2 如何为表单生成新的Csrf令牌

Zend framework2 如何为表单生成新的Csrf令牌,zend-framework2,zend-form,csrf,Zend Framework2,Zend Form,Csrf,我有一张表格。当我更改表单中的Select元素时,我会对同一URL进行Ajax调用,这基本上会加载一个新表单,该表单包含一些附加字段或删除了一些字段(不同的类别、不同的字段…) 现在,我从请求中得到的表单显然将具有相同的Csrf令牌,因为该令牌只用于一个请求。也就是说,每当我做这种动作时,我都必须生成一个新的令牌,但我真的不知道如何做 我的假设是我必须做类似的事情 if ($request->isXmlHttpRequest()) { $form->get('csrf')

我有一张表格。当我更改表单中的Select元素时,我会对同一URL进行Ajax调用,这基本上会加载一个新表单,该表单包含一些附加字段或删除了一些字段(不同的类别、不同的字段…)

现在,我从请求中得到的表单显然将具有相同的Csrf令牌,因为该令牌只用于一个请求。也就是说,每当我做这种动作时,我都必须生成一个新的令牌,但我真的不知道如何做

我的假设是我必须做类似的事情

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')    ->regenerateCsrfToken()
}
但很明显,这个函数并不存在,但它应该是类似于这些行的东西。如果您有任何意见,我们将不胜感激

您是否尝试过以下方法:

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')->getCsrfValidator()->getHash(true);
}

getHash(true)
将重新生成散列,并将更改后的散列存储在生成器中,因此当您稍后从元素中检索新值时,表单将检索新值。

@MichaelGooden的答案绝对正确。这是解决问题的一般方法。然而,在我所做的工作中,还有一个错误,这可能也与其他用户有关。
select.onChange()
方法的主要功能是:

  • 保存表单数据
  • 获取新表单(get/item/add/categoryId)
  • 重新填充相同的表单字段
这样做时,我也意外地保存了CSRF令牌,并将存储的令牌重新填充为新令牌。很明显,这是行不通的。因此,在我的
form.rePopulate(data)
函数中,我只是排除了CSRF元素,就这样,所有这些都像一个符咒一样工作