Actions
Bug #89434
closedEpic #90106: [Extbase] Priority Bugfixes
Action argument values will get lost on validation error
Start date:
2019-10-16
Due date:
% Done:
100%
Estimated time:
TYPO3 Version:
10
PHP Version:
7.2
Tags:
Complexity:
Is Regression:
Yes
Sprint Focus:
Description
Action arguments and values will get lost when given object is invalid.
How to Reproduce¶
Create an ActionController with at least following actions:
/**
* @param MyObject $myObject
* @TYPO3\CMS\Extbase\Annotation\IgnoreValidation("myObject")
*/
public function editAction(MyObject $myObject): void
{
$this->view->assign('myObject', $myObject);
}
/**
* @param MyObject $myObject
*/
public function updateAction(MyObject $myObject): void
{
$this->myObjectRepository->update($myObject);
$this->redirect('index');
}
The object itself has a validator:
/**
* @var float
* @TYPO3\CMS\Extbase\Annotation\Validate("NumberRange", options={"minimum": -1000, "maximum": 100})
*/
protected $value = 0;
If you now try to edit an object and set the value to 1000, following exception will be thrown:
#1298012500 TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException Required argument "myObject" is not set for Vendor\Example\Controller\SampleController->edit.
Backtrace:
/var/www/example/web/typo3/sysext/extbase/Classes/Mvc/Controller/AbstractController.php line 399 /var/www/example/web/typo3/sysext/extbase/Classes/Mvc/Controller/ActionController.php line 162 /var/www/example/web/typo3/sysext/extbase/Classes/Mvc/Dispatcher.php line 81 /var/www/example/web/typo3/sysext/extbase/Classes/Mvc/Web/FrontendRequestHandler.php line 92 /var/www/example/web/typo3/sysext/extbase/Classes/Core/Bootstrap.php line 181 /var/www/example/web/typo3/sysext/extbase/Classes/Core/Bootstrap.php line 171
Possible Solution¶
Modify the renderHiddenReferrerFields method in typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php:
if (!empty($request->getArguments())) {
$actionRequest += $this->getActionArguments($request, $actionName);
}
Add this method to the same class:
/**
* Get all valid action arguments and their values.
*
* @param Request $request
* @param string $actionName
*
* @return array
* @throws \ReflectionException
*/
protected function getActionArguments(Request $request, string $actionName): array
{
$actionArguments = [];
$reflectionMethod = new \ReflectionMethod($request->getControllerObjectName(), $actionName . 'Action');
$reflectionParameters = $reflectionMethod->getParameters();
foreach ($reflectionParameters as $reflectionParameter) {
$argumentName = $reflectionParameter->getName();
if ($request->hasArgument($argumentName)) {
try {
$actionArguments[$argumentName] = $request->getArgument($argumentName);
} catch (NoSuchArgumentException $exception) {
// Do nothing.
}
}
}
return $actionArguments;
}
Make sure to add missing use statements.
Files
Actions