发生验证错误时操作的参数丢失
Parameters to action lost when validation error occurs
我有两个动作,newAction
和 createAction
。两者都获得相同的参数,这些参数是普通值,而不是对象。
他们的实现类似于:
/**
* Renders a form with the createAction as action="".
*
* @param string $value1
* @param boolean $value2
*
* @ignorevalidation $value1
* @ignorevalidation $value2
*/
public function newAction($value1 = NULL, $value2 = NULL) {
$this->view->assignMultiple([
'value1' => $value1,
'value2' => $value2,
]);
}
/**
* @param string $value1
* @param boolean $value2
*
* @validate $value1 NotEmpty
* @validate $value1 EmailAddress
* @validate $value1 \Vendor\Extkey\Validator\MyValidator
*
* @validate $value2 Boolean(is=TRUE)
*/
public function createAction($value1, $value2) {
// Do some stuff
}
如果 newAction
在没有参数的情况下执行,一切正常,表单显示时没有预填字段。
如果使用有效值提交表单,createAction
将使用正确的值调用,一切都按预期进行。
如果提交的表单包含无效值,则验证会失败,正如预期的那样。然后请求再次转发到 newAction,因为它应该 - 但是 newAction 的参数都是 NULL
,而不是之前输入到表单中的无效值。
我已经确定参数确实被提交了(var_dump($_POST)
),并且 TYPO3 已经收到了它们(通过在 errorAction
中打印它们)。
为什么会这样,我做错了吗?还是extbase在那个地方坏了?
TYPO3-版本:6.2.15
好的,我刚刚找到了原因:这是故意这样做的,以避免传递验证失败的值。 Here is the forge ticket.
为了获取无效参数,可以使用$this->request->getOriginalRequest()
访问原始请求。在我上面的例子中这样做可能看起来像这样:
/**
* Renders a form with the createAction as action="".
* No more parameters here!
*/
public function newAction() {
$originalRequest = $this->request->getOriginalRequest();
if (NULL !== $originalRequest) {
$this->view->assignMultiple($originalRequest->getArguments());
}
}
/**
* @param string $value1
* @param boolean $value2
*
* @validate $value1 NotEmpty
* @validate $value1 EmailAddress
* @validate $value1 \Vendor\Extkey\Validator\MyValidator
*
* @validate $value2 Boolean(is=TRUE)
*/
public function createAction($value1, $value2) {
// Do some stuff
}
我有两个动作,newAction
和 createAction
。两者都获得相同的参数,这些参数是普通值,而不是对象。
他们的实现类似于:
/**
* Renders a form with the createAction as action="".
*
* @param string $value1
* @param boolean $value2
*
* @ignorevalidation $value1
* @ignorevalidation $value2
*/
public function newAction($value1 = NULL, $value2 = NULL) {
$this->view->assignMultiple([
'value1' => $value1,
'value2' => $value2,
]);
}
/**
* @param string $value1
* @param boolean $value2
*
* @validate $value1 NotEmpty
* @validate $value1 EmailAddress
* @validate $value1 \Vendor\Extkey\Validator\MyValidator
*
* @validate $value2 Boolean(is=TRUE)
*/
public function createAction($value1, $value2) {
// Do some stuff
}
如果 newAction
在没有参数的情况下执行,一切正常,表单显示时没有预填字段。
如果使用有效值提交表单,createAction
将使用正确的值调用,一切都按预期进行。
如果提交的表单包含无效值,则验证会失败,正如预期的那样。然后请求再次转发到 newAction,因为它应该 - 但是 newAction 的参数都是 NULL
,而不是之前输入到表单中的无效值。
我已经确定参数确实被提交了(var_dump($_POST)
),并且 TYPO3 已经收到了它们(通过在 errorAction
中打印它们)。
为什么会这样,我做错了吗?还是extbase在那个地方坏了?
TYPO3-版本:6.2.15
好的,我刚刚找到了原因:这是故意这样做的,以避免传递验证失败的值。 Here is the forge ticket.
为了获取无效参数,可以使用$this->request->getOriginalRequest()
访问原始请求。在我上面的例子中这样做可能看起来像这样:
/**
* Renders a form with the createAction as action="".
* No more parameters here!
*/
public function newAction() {
$originalRequest = $this->request->getOriginalRequest();
if (NULL !== $originalRequest) {
$this->view->assignMultiple($originalRequest->getArguments());
}
}
/**
* @param string $value1
* @param boolean $value2
*
* @validate $value1 NotEmpty
* @validate $value1 EmailAddress
* @validate $value1 \Vendor\Extkey\Validator\MyValidator
*
* @validate $value2 Boolean(is=TRUE)
*/
public function createAction($value1, $value2) {
// Do some stuff
}