Skip to content

Commit

Permalink
Refactor validation
Browse files Browse the repository at this point in the history
  • Loading branch information
garbast committed Jan 13, 2019
1 parent 5003e7f commit d659d5f
Show file tree
Hide file tree
Showing 12 changed files with 216 additions and 390 deletions.
2 changes: 1 addition & 1 deletion .Build/run_functional_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,5 @@ runFunctionalTests ()
cd ../;
composer update;

#runUnitTests;
runUnitTests;
runFunctionalTests;
98 changes: 97 additions & 1 deletion Classes/Controller/FeuserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,19 @@
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration;
use TYPO3\CMS\Extbase\Property\TypeConverter\PersistentObjectConverter;
use TYPO3\CMS\Extbase\Validation\Validator\ConjunctionValidator;
use TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface;

/**
* An frontend user controller
*/
class FeuserController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
/**
* @var string
*/
protected $controller = '';

/**
* User repository
*
Expand Down Expand Up @@ -125,7 +132,96 @@ protected function getErrorFlashMessage(): bool

protected function initializeActionMethodValidators()
{
parent::initializeActionMethodValidators();
if (empty($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = $this->settings['fields'][$this->controller . 'DefaultSelected'];
} elseif (!is_array($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = explode(',', $this->settings['fields']['selected']);
}

if ($this->arguments->hasArgument('user')) {
$this->modifyValidatorsBasedOnSettings(
$this->arguments->getArgument('user'),
$this->settings['validation'][$this->controller] ?? []
);
} elseif ($this->arguments->hasArgument('password')) {
$this->modifyValidatorsBasedOnSettings(
$this->arguments->getArgument('password'),
$this->settings['validation']['password'] ?? []
);
} else {
parent::initializeActionMethodValidators();
}
}

protected function modifyValidatorsBasedOnSettings(
\TYPO3\CMS\Extbase\Mvc\Controller\Argument $argument,
array $configuredValidators
) {
/** @var \TYPO3\CMS\Extbase\Validation\ValidatorResolver $validatorResolver */
$validatorResolver = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Validation\ValidatorResolver::class);
$parser = new \Doctrine\Common\Annotations\DocParser();

/** @var \Evoweb\SfRegister\Validation\Validator\UserValidator $validator */
$validator = $this->objectManager->get(\Evoweb\SfRegister\Validation\Validator\UserValidator::class);
foreach ($configuredValidators as $fieldName => $configuredValidator) {
if (!in_array($fieldName, $this->settings['fields']['selected'])) {
continue;
}

if (!is_array($configuredValidator)) {
$validatorInstance = $this->getValidatorByConfiguration(
$configuredValidator,
$parser,
$validatorResolver
);

if (method_exists($validatorInstance, 'setPropertyName')) {
$validatorInstance->setPropertyName($fieldName);
}
} else {
$validatorInstance = $this->objectManager->get(ConjunctionValidator::class);
foreach ($configuredValidator as $individualConfiguredValidator) {
$individualValidatorInstance = $this->getValidatorByConfiguration(
$individualConfiguredValidator,
$parser,
$validatorResolver
);

if (method_exists($individualValidatorInstance, 'setPropertyName')) {
$individualValidatorInstance->setPropertyName($fieldName);
}

$validatorInstance->addValidator($individualValidatorInstance);
}
}

$validator->addPropertyValidator($fieldName, $validatorInstance);
}
$argument->setValidator($validator);
}

/**
* @param $configuration
* @param \Doctrine\Common\Annotations\DocParser $parser
* @param \TYPO3\CMS\Extbase\Validation\ValidatorResolver $validatorResolver
*
* @return ValidatorInterface
*/
protected function getValidatorByConfiguration($configuration, $parser, $validatorResolver)
{
/** @var \TYPO3\CMS\Extbase\Annotation\Validate $validateAnnotation */
$validateAnnotation = current($parser->parse(
'@TYPO3\CMS\Extbase\Annotation\Validate(' . $configuration . ')'
));
$validatorObjectName = $validatorResolver->resolveValidatorObjectName($validateAnnotation->validator);

/** @var ValidatorInterface $validatorInstance */
$validatorInstance = $this->objectManager->get(
$validatorObjectName,
$validateAnnotation->options
);

return $validatorInstance;
}

protected function initializeAction()
Expand Down
14 changes: 4 additions & 10 deletions Classes/Controller/FeuserCreateController.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,10 @@
*/
class FeuserCreateController extends FeuserController
{
protected function initializeAction()
{
parent::initializeAction();

if (empty($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = $this->settings['fields']['createDefaultSelected'];
} elseif (!is_array($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = explode(',', $this->settings['fields']['selected']);
}
}
/**
* @var string
*/
protected $controller = 'create';

public function formAction(\Evoweb\SfRegister\Domain\Model\FrontendUser $user = null)
{
Expand Down
14 changes: 4 additions & 10 deletions Classes/Controller/FeuserEditController.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,10 @@
*/
class FeuserEditController extends FeuserController
{
protected function initializeAction()
{
parent::initializeAction();

if (empty($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = $this->settings['fields']['editDefaultSelected'];
} elseif (!is_array($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = explode(',', $this->settings['fields']['selected']);
}
}
/**
* @var string
*/
protected $controller = 'edit';

public function formAction(\Evoweb\SfRegister\Domain\Model\FrontendUser $user = null)
{
Expand Down
14 changes: 4 additions & 10 deletions Classes/Controller/FeuserInviteController.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,10 @@
*/
class FeuserInviteController extends FeuserController
{
protected function initializeAction()
{
parent::initializeAction();

if (empty($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = $this->settings['fields']['inviteDefaultSelected'];
} elseif (!is_array($this->settings['fields']['selected'])) {
$this->settings['fields']['selected'] = explode(',', $this->settings['fields']['selected']);
}
}
/**
* @var string
*/
protected $controller = 'invite';

public function formAction(\Evoweb\SfRegister\Domain\Model\FrontendUser $user = null)
{
Expand Down
5 changes: 5 additions & 0 deletions Classes/Controller/FeuserPasswordController.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
*/
class FeuserPasswordController extends FeuserController
{
/**
* @var string
*/
protected $controller = 'password';

public function formAction()
{
$this->signalSlotDispatcher->dispatch(
Expand Down
24 changes: 22 additions & 2 deletions Classes/Validation/Validator/RepeatValidator.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<?php
namespace Evoweb\SfRegister\Validation\Validator;

use TYPO3\CMS\Extbase\Reflection\ObjectAccess;

/***************************************************************
* Copyright notice
*
Expand Down Expand Up @@ -69,8 +71,7 @@ public function setPropertyName(string $propertyName)
public function isValid($value)
{
$propertyName = str_replace('Repeat', '', $this->propertyName);
$getterMethod = 'get' . ucfirst($propertyName);
if ($value != $this->model->{$getterMethod}()) {
if ($value != $this->getPropertyValue($this->model, $propertyName)) {
$this->addError(
$this->translateErrorMessage(
'error_repeatitionwasnotequal',
Expand All @@ -81,4 +82,23 @@ public function isValid($value)
);
}
}

/**
* Load the property value to be used for validation.
*
* In case the object is a doctrine proxy, we need to load the real instance first.
*
* @param object $object
* @param string $propertyName
*
* @return mixed
*/
protected function getPropertyValue($object, $propertyName)
{
// @todo add support for lazy loading proxies, if needed
if (ObjectAccess::isPropertyGettable($object, $propertyName)) {
return ObjectAccess::getProperty($object, $propertyName);
}
return ObjectAccess::getProperty($object, $propertyName, true);
}
}
Loading

0 comments on commit d659d5f

Please sign in to comment.