diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 4edb96e9d3c44..4bbdda936c5bc 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -53,6 +53,14 @@ public function getConfigTreeBuilder() return $v; }) ->end() + ->beforeNormalization() + ->ifTrue(function ($v) { return isset($v['validation']['api']); }) + ->then(function ($v) { + trigger_error('The validation.api configuration key is deprecated since version 2.7 and will be removed in 3.0', E_USER_DEPRECATED); + + return $v; + }) + ->end() ->children() ->scalarNode('secret')->end() ->scalarNode('http_method_override') @@ -495,6 +503,7 @@ private function addValidationSection(ArrayNodeDefinition $rootNode) ->scalarNode('translation_domain')->defaultValue('validators')->end() ->booleanNode('strict_email')->defaultFalse()->end() ->enumNode('api') + ->info('Deprecated since version 2.7, to be removed in 3.0') ->values(array('2.4', '2.5', '2.5-bc', 'auto')) ->beforeNormalization() // XML/YAML parse as numbers, not as strings @@ -505,19 +514,6 @@ private function addValidationSection(ArrayNodeDefinition $rootNode) ->end() ->end() ->end() - ->validate() - ->ifTrue(function ($v) { return !isset($v['validation']['api']) || 'auto' === $v['validation']['api']; }) - ->then(function ($v) { - // This condition is duplicated in ValidatorBuilder. This - // duplication is necessary in order to know the desired - // API version already during container configuration - // (to adjust service classes etc.) - // See https://github.com/symfony/symfony/issues/11580 - $v['validation']['api'] = '2.5-bc'; - - return $v; - }) - ->end() ; } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 2a67e53d8ae89..a2344cea674c4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -756,20 +756,10 @@ private function registerValidationConfiguration(array $config, ContainerBuilder $validatorBuilder->addMethodCall('setMetadataCache', array(new Reference($config['cache']))); } - if ('2.5' === $config['api']) { - $api = Validation::API_VERSION_2_5; - } else { - // 2.4 is now the same as 2.5 BC - $api = Validation::API_VERSION_2_5_BC; - // the validation class needs to be changed for BC - $container->setParameter('validator.class', 'Symfony\Component\Validator\ValidatorInterface'); - } - - $validatorBuilder->addMethodCall('setApiVersion', array($api)); - // You can use this parameter to check the API version in your own // bundle extension classes - $container->setParameter('validator.api', $api); + // @deprecated since version 2.7, to be removed in 3.0 + $container->setParameter('validator.api', $config['api']); } private function getValidatorMappingFiles(ContainerBuilder $container) diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 48e96c3cedb64..9bb05c8532f6e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -305,14 +305,14 @@ public function testFullyConfiguredValidationService() $container = $this->createContainerFromFile('full'); - $this->assertInstanceOf('Symfony\Component\Validator\ValidatorInterface', $container->get('validator')); + $this->assertInstanceOf('Symfony\Component\Validator\Validator\ValidatorInterface', $container->get('validator')); } public function testValidationService() { $container = $this->createContainerFromFile('validation_annotations'); - $this->assertInstanceOf('Symfony\Component\Validator\ValidatorInterface', $container->get('validator')); + $this->assertInstanceOf('Symfony\Component\Validator\Validator\ValidatorInterface', $container->get('validator')); } public function testAnnotations() diff --git a/src/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php b/src/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php index e717d9a521b1f..88e8b3b82689d 100644 --- a/src/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php +++ b/src/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php @@ -110,25 +110,8 @@ public function testSetTranslationDomain() $this->assertSame($this->builder, $this->builder->setTranslationDomain('TRANS_DOMAIN')); } - public function testLegacyDefaultApiVersion() + public function testGetValidator() { - $this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED); - - // Legacy compatible implementation - $this->assertInstanceOf('Symfony\Component\Validator\Validator\LegacyValidator', $this->builder->getValidator()); - } - - public function testSetApiVersion25() - { - $this->assertSame($this->builder, $this->builder->setApiVersion(Validation::API_VERSION_2_5)); $this->assertInstanceOf('Symfony\Component\Validator\Validator\RecursiveValidator', $this->builder->getValidator()); } - - public function testLegacySetApiVersion24And25() - { - $this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED); - - $this->assertSame($this->builder, $this->builder->setApiVersion(Validation::API_VERSION_2_5_BC)); - $this->assertInstanceOf('Symfony\Component\Validator\Validator\LegacyValidator', $this->builder->getValidator()); - } } diff --git a/src/Symfony/Component/Validator/Validator/LegacyValidator.php b/src/Symfony/Component/Validator/Validator/LegacyValidator.php index 8995f2cfdd593..f73a79ef0e26a 100644 --- a/src/Symfony/Component/Validator/Validator/LegacyValidator.php +++ b/src/Symfony/Component/Validator/Validator/LegacyValidator.php @@ -11,9 +11,6 @@ namespace Symfony\Component\Validator\Validator; -use Symfony\Component\Validator\Constraint; -use Symfony\Component\Validator\Constraints\GroupSequence; -use Symfony\Component\Validator\Constraints\Valid; use Symfony\Component\Validator\ValidatorInterface as LegacyValidatorInterface; /** @@ -31,22 +28,9 @@ class LegacyValidator extends RecursiveValidator implements LegacyValidatorInter { public function validate($value, $groups = null, $traverse = false, $deep = false) { - $numArgs = func_num_args(); - - // Use new signature if constraints are given in the second argument - if (self::testConstraints($groups) && ($numArgs < 3 || 3 === $numArgs && self::testGroups($traverse))) { - // Rename to avoid total confusion ;) - $constraints = $groups; - $groups = $traverse; - - return parent::validate($value, $constraints, $groups); - } - trigger_error('The '.__METHOD__.' method is deprecated in version 2.5 and will be removed in version 3.0. Use the Symfony\Component\Validator\Validator\ValidatorInterface::validate method instead.', E_USER_DEPRECATED); - $constraint = new Valid(array('traverse' => $traverse, 'deep' => $deep)); - - return parent::validate($value, $constraint, $groups); + return parent::validate($value, false, $groups, $traverse, $deep); } public function validateValue($value, $constraints, $groups = null) @@ -62,14 +46,4 @@ public function getMetadataFactory() return $this->metadataFactory; } - - private static function testConstraints($constraints) - { - return null === $constraints || $constraints instanceof Constraint || (is_array($constraints) && current($constraints) instanceof Constraint); - } - - private static function testGroups($groups) - { - return null === $groups || is_string($groups) || $groups instanceof GroupSequence || (is_array($groups) && (is_string(current($groups)) || current($groups) instanceof GroupSequence)); - } } diff --git a/src/Symfony/Component/Validator/Validator/RecursiveValidator.php b/src/Symfony/Component/Validator/Validator/RecursiveValidator.php index ddf0850c1cf2a..7cfbc27fbf0d6 100644 --- a/src/Symfony/Component/Validator/Validator/RecursiveValidator.php +++ b/src/Symfony/Component/Validator/Validator/RecursiveValidator.php @@ -11,6 +11,9 @@ namespace Symfony\Component\Validator\Validator; +use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\Constraints\GroupSequence; +use Symfony\Component\Validator\Constraints\Valid; use Symfony\Component\Validator\ConstraintValidatorFactoryInterface; use Symfony\Component\Validator\Context\ExecutionContextFactoryInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; @@ -112,6 +115,22 @@ public function hasMetadataFor($object) */ public function validate($value, $constraints = null, $groups = null) { + // The following code must be removed in 3.0 + $numArgs = func_num_args(); + if ($numArgs > 3) { + trigger_error('The '.__METHOD__.' method is deprecated in version 2.5 and will be removed in version 3.0. Use the Symfony\Component\Validator\Validator\ValidatorInterface::validate method instead.', E_USER_DEPRECATED); + $traverse = func_get_arg(3); + $deep = func_get_arg(4); + $constraints = new Valid(array('traverse' => $traverse, 'deep' => $deep)); + + if (self::testConstraints($groups)) { + if ((!$traverse && !$deep) || self::testGroups($traverse)) { + $constraints = $groups; + $groups = $traverse; + } + } + } + return $this->startContext($value) ->validate($value, $constraints, $groups) ->getViolations(); @@ -137,4 +156,22 @@ public function validatePropertyValue($objectOrClass, $propertyName, $value, $gr ->validatePropertyValue($objectOrClass, $propertyName, $value, $groups) ->getViolations(); } + + /** + * @internal + * @deprecated since version 2.5, to be removed in 3.0. + */ + private static function testConstraints($constraints) + { + return null === $constraints || $constraints instanceof Constraint || (is_array($constraints) && current($constraints) instanceof Constraint); + } + + /** + * @internal + * @deprecated since version 2.5, to be removed in 3.0. + */ + private static function testGroups($groups) + { + return null === $groups || is_string($groups) || $groups instanceof GroupSequence || (is_array($groups) && (is_string(current($groups)) || current($groups) instanceof GroupSequence)); + } } diff --git a/src/Symfony/Component/Validator/ValidatorBuilder.php b/src/Symfony/Component/Validator/ValidatorBuilder.php index e47d1f42a6822..dd772cf383254 100644 --- a/src/Symfony/Component/Validator/ValidatorBuilder.php +++ b/src/Symfony/Component/Validator/ValidatorBuilder.php @@ -19,7 +19,6 @@ use Symfony\Component\Translation\IdentityTranslator; use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Context\ExecutionContextFactory; -use Symfony\Component\Validator\Context\LegacyExecutionContextFactory; use Symfony\Component\Validator\Exception\InvalidArgumentException; use Symfony\Component\Validator\Exception\ValidatorException; use Symfony\Component\Validator\Mapping\Cache\CacheInterface; @@ -31,7 +30,6 @@ use Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader; use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader; use Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader; -use Symfony\Component\Validator\Validator\LegacyValidator; use Symfony\Component\Validator\Validator\RecursiveValidator; /** @@ -96,11 +94,6 @@ class ValidatorBuilder implements ValidatorBuilderInterface */ private $propertyAccessor; - /** - * @var int|null - */ - private $apiVersion; - /** * {@inheritdoc} */ @@ -320,18 +313,17 @@ public function setPropertyAccessor(PropertyAccessorInterface $propertyAccessor) /** * {@inheritdoc} + * + * @deprecated since version 2.7, to be removed in 3.0. */ public function setApiVersion($apiVersion) { + trigger_error('The '.__METHOD__.' method is deprecated in version 2.7 and will be removed in version 3.0.', E_USER_DEPRECATED); + if (!in_array($apiVersion, array(Validation::API_VERSION_2_4, Validation::API_VERSION_2_5, Validation::API_VERSION_2_5_BC))) { - throw new InvalidArgumentException(sprintf( - 'The requested API version is invalid: "%s"', - $apiVersion - )); + throw new InvalidArgumentException(sprintf('The requested API version is invalid: "%s"', $apiVersion)); } - $this->apiVersion = $apiVersion; - return $this; } @@ -341,11 +333,6 @@ public function setApiVersion($apiVersion) public function getValidator() { $metadataFactory = $this->metadataFactory; - $apiVersion = $this->apiVersion; - - if (null === $apiVersion) { - $apiVersion = Validation::API_VERSION_2_5_BC; - } if (!$metadataFactory) { $loaders = array(); @@ -393,14 +380,8 @@ public function getValidator() $translator->setLocale('en'); } - if (Validation::API_VERSION_2_5 === $apiVersion) { - $contextFactory = new ExecutionContextFactory($translator, $this->translationDomain); - - return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers); - } - - $contextFactory = new LegacyExecutionContextFactory($metadataFactory, $translator, $this->translationDomain); + $contextFactory = new ExecutionContextFactory($translator, $this->translationDomain); - return new LegacyValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers); + return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers); } } diff --git a/src/Symfony/Component/Validator/ValidatorBuilderInterface.php b/src/Symfony/Component/Validator/ValidatorBuilderInterface.php index 6e2dd96a2dfce..cc0007770578b 100644 --- a/src/Symfony/Component/Validator/ValidatorBuilderInterface.php +++ b/src/Symfony/Component/Validator/ValidatorBuilderInterface.php @@ -180,6 +180,8 @@ public function setPropertyAccessor(PropertyAccessorInterface $propertyAccessor) * * @see Validation::API_VERSION_2_5 * @see Validation::API_VERSION_2_5_BC + * + * @deprecated since version 2.7, to be removed in 3.0. */ public function setApiVersion($apiVersion);