diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
index 3711701565..0ba78c5345 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
@@ -189,6 +189,18 @@ class Configuration implements ConfigurationInterface
->scalarNode('field_name')->defaultValue('_token')->end()
->end()
->end()
+ // to be set to false in Symfony 6.0
+ ->booleanNode('legacy_error_messages')
+ ->defaultTrue()
+ ->validate()
+ ->ifTrue()
+ ->then(function ($v) {
+ @trigger_error('Since symfony/framework-bundle 5.2: Setting the "framework.form.legacy_error_messages" option to "true" is deprecated. It will have no effect as of Symfony 6.0.', E_USER_DEPRECATED);
+
+ return $v;
+ })
+ ->end()
+ ->end()
->end()
->end()
->end()
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
index 0a4f3b283c..7e301a52ee 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
@@ -514,6 +514,8 @@ class FrameworkExtension extends Extension
{
$loader->load('form.php');
+ $container->getDefinition('form.type_extension.form.validator')->setArgument(1, $config['form']['legacy_error_messages']);
+
if (null === $config['form']['csrf_protection']['enabled']) {
$config['form']['csrf_protection']['enabled'] = $config['csrf_protection']['enabled'];
}
diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd
index 899a6eb631..526cf1970e 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd
+++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd
@@ -52,6 +52,7 @@
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
index 7e1ed5f731..086116c2d0 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
@@ -354,6 +354,7 @@ class ConfigurationTest extends TestCase
'enabled' => null, // defaults to csrf_protection.enabled
'field_name' => '_token',
],
+ 'legacy_error_messages' => true,
],
'esi' => ['enabled' => false],
'ssi' => ['enabled' => false],
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/csrf.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/csrf.php
index 886cb657b2..e3f3577c1b 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/csrf.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/csrf.php
@@ -2,7 +2,9 @@
$container->loadFromExtension('framework', [
'csrf_protection' => true,
- 'form' => true,
+ 'form' => [
+ 'legacy_error_messages' => false,
+ ],
'session' => [
'handler_id' => null,
],
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_legacy_messages.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_legacy_messages.php
new file mode 100644
index 0000000000..6e98e3cb6d
--- /dev/null
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_legacy_messages.php
@@ -0,0 +1,7 @@
+loadFromExtension('framework', [
+ 'form' => [
+ 'legacy_error_messages' => true,
+ ],
+]);
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_no_csrf.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_no_csrf.php
index e0befdb320..c6bde28a78 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_no_csrf.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_no_csrf.php
@@ -5,5 +5,6 @@ $container->loadFromExtension('framework', [
'csrf_protection' => [
'enabled' => false,
],
+ 'legacy_error_messages' => false,
],
]);
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php
index b11b5e08dc..647044e613 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php
@@ -8,6 +8,7 @@ $container->loadFromExtension('framework', [
'csrf_protection' => [
'field_name' => '_csrf',
],
+ 'legacy_error_messages' => false,
],
'http_method_override' => false,
'esi' => [
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/csrf.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/csrf.xml
index 4cd628eadc..4686d9ffc0 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/csrf.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/csrf.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml
index 1bdf2e5284..1552a3ceb6 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml
@@ -9,6 +9,6 @@
-
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml
index c04193e837..dda2e724cc 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_legacy_messages.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_legacy_messages.xml
new file mode 100644
index 0000000000..4c94a4c79d
--- /dev/null
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_legacy_messages.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_no_csrf.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_no_csrf.xml
index 092174a2d9..3af5322be2 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_no_csrf.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_no_csrf.xml
@@ -7,7 +7,7 @@
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
-
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml
index 10a646049d..9207066f1c 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/csrf.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/csrf.yml
index dbdd495194..d29019cf48 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/csrf.yml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/csrf.yml
@@ -1,5 +1,6 @@
framework:
secret: s3cr3t
csrf_protection: ~
- form: ~
+ form:
+ legacy_error_messages: false
session: ~
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_legacy_messages.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_legacy_messages.yml
new file mode 100644
index 0000000000..77c04e852f
--- /dev/null
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_legacy_messages.yml
@@ -0,0 +1,3 @@
+framework:
+ form:
+ legacy_error_messages: true
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_no_csrf.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_no_csrf.yml
index e3ac7e8daf..1295018de1 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_no_csrf.yml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_no_csrf.yml
@@ -2,3 +2,4 @@ framework:
form:
csrf_protection:
enabled: false
+ legacy_error_messages: false
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml
index 5ad80a2da4..2206585863 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml
@@ -5,6 +5,7 @@ framework:
form:
csrf_protection:
field_name: _csrf
+ legacy_error_messages: false
http_method_override: false
esi:
enabled: true
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
index 5480ec7ecf..af4f8105a5 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
@@ -13,6 +13,7 @@ namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection;
use Doctrine\Common\Annotations\Annotation;
use Psr\Log\LoggerAwareInterface;
+use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage;
@@ -57,6 +58,8 @@ use Symfony\Component\Workflow;
abstract class FrameworkExtensionTest extends TestCase
{
+ use ExpectDeprecationTrait;
+
private static $containerCache = [];
abstract protected function loadFromFile(ContainerBuilder $container, $file);
@@ -1015,6 +1018,16 @@ abstract class FrameworkExtensionTest extends TestCase
$this->assertFalse($container->getParameter('form.type_extension.csrf.enabled'));
}
+ /**
+ * @group legacy
+ */
+ public function testFormsWithoutImprovedValidationMessages()
+ {
+ $this->expectDeprecation('Since symfony/framework-bundle 5.2: Setting the "framework.form.legacy_error_messages" option to "true" is deprecated. It will have no effect as of Symfony 6.0.');
+
+ $this->createContainerFromFile('form_legacy_messages');
+ }
+
public function testStopwatchEnabledWithDebugModeEnabled()
{
$container = $this->createContainerFromFile('default_config', [
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/config/framework.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/config/framework.yml
index 1c42894a24..50078d4fd5 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/config/framework.yml
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/config/framework.yml
@@ -3,7 +3,9 @@ framework:
router: { resource: "%kernel.project_dir%/%kernel.test_case%/routing.yml", utf8: true }
validation: { enabled: true, enable_annotations: true }
csrf_protection: true
- form: true
+ form:
+ enabled: true
+ legacy_error_messages: false
test: true
default_locale: en
session:
diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/FirewallEntryPoint/config.yml b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/FirewallEntryPoint/config.yml
index 302d738276..25ef98650e 100644
--- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/FirewallEntryPoint/config.yml
+++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/FirewallEntryPoint/config.yml
@@ -3,7 +3,9 @@ framework:
router: { resource: "%kernel.project_dir%/%kernel.test_case%/routing.yml", utf8: true }
validation: { enabled: true, enable_annotations: true }
csrf_protection: true
- form: true
+ form:
+ enabled: true
+ legacy_error_messages: false
test: ~
default_locale: en
session:
diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/config/framework.yml b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/config/framework.yml
index 3c60329efb..e145253080 100644
--- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/config/framework.yml
+++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/config/framework.yml
@@ -4,7 +4,9 @@ framework:
validation: { enabled: true, enable_annotations: true }
assets: ~
csrf_protection: true
- form: true
+ form:
+ enabled: true
+ legacy_error_messages: false
test: ~
default_locale: en
session:
diff --git a/src/Symfony/Bundle/SecurityBundle/composer.json b/src/Symfony/Bundle/SecurityBundle/composer.json
index 6e93ae9266..892d847936 100644
--- a/src/Symfony/Bundle/SecurityBundle/composer.json
+++ b/src/Symfony/Bundle/SecurityBundle/composer.json
@@ -37,7 +37,7 @@
"symfony/dom-crawler": "^4.4|^5.0",
"symfony/expression-language": "^4.4|^5.0",
"symfony/form": "^4.4|^5.0",
- "symfony/framework-bundle": "^4.4|^5.0",
+ "symfony/framework-bundle": "^5.2",
"symfony/process": "^4.4|^5.0",
"symfony/serializer": "^4.4|^5.0",
"symfony/translation": "^4.4|^5.0",
diff --git a/src/Symfony/Component/Form/Extension/Core/EventListener/TransformationFailureListener.php b/src/Symfony/Component/Form/Extension/Core/EventListener/TransformationFailureListener.php
index facd925c0e..dd2a2f284c 100644
--- a/src/Symfony/Component/Form/Extension/Core/EventListener/TransformationFailureListener.php
+++ b/src/Symfony/Component/Form/Extension/Core/EventListener/TransformationFailureListener.php
@@ -51,14 +51,15 @@ class TransformationFailureListener implements EventSubscriberInterface
}
$clientDataAsString = is_scalar($form->getViewData()) ? (string) $form->getViewData() : get_debug_type($form->getViewData());
- $messageTemplate = 'The value {{ value }} is not valid.';
+ $messageTemplate = $form->getConfig()->getOption('invalid_message', 'The value {{ value }} is not valid.');
+ $messageParameters = array_replace(['{{ value }}' => $clientDataAsString], $form->getConfig()->getOption('invalid_message_parameters', []));
if (null !== $this->translator) {
- $message = $this->translator->trans($messageTemplate, ['{{ value }}' => $clientDataAsString]);
+ $message = $this->translator->trans($messageTemplate, $messageParameters);
} else {
- $message = strtr($messageTemplate, ['{{ value }}' => $clientDataAsString]);
+ $message = strtr($messageTemplate, $messageParameters);
}
- $form->addError(new FormError($message, $messageTemplate, ['{{ value }}' => $clientDataAsString], null, $form->getTransformationFailure()));
+ $form->addError(new FormError($message, $messageTemplate, $messageParameters, null, $form->getTransformationFailure()));
}
}
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php b/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php
index a4e8b8d41c..50d8b1e210 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class BirthdayType extends AbstractType
@@ -21,7 +22,14 @@ class BirthdayType extends AbstractType
*/
public function configureOptions(OptionsResolver $resolver)
{
- $resolver->setDefault('years', range((int) date('Y') - 120, date('Y')));
+ $resolver->setDefaults([
+ 'years' => range((int) date('Y') - 120, date('Y')),
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid birthdate.';
+ },
+ ]);
$resolver->setAllowedTypes('years', 'array');
}
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php b/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php
index 2741a9afd4..7322fd00c6 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php
@@ -16,6 +16,7 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\BooleanToStringTransfo
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CheckboxType extends AbstractType
@@ -60,6 +61,11 @@ class CheckboxType extends AbstractType
'empty_data' => $emptyData,
'compound' => false,
'false_values' => [null],
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'The checkbox has an invalid value.';
+ },
'is_empty_callback' => static function ($modelData): bool {
return false === $modelData;
},
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
index 6921ffa27f..b25f34fc18 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
@@ -338,6 +338,11 @@ class ChoiceType extends AbstractType
'data_class' => null,
'choice_translation_domain' => true,
'trim' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'The selected choice is invalid.';
+ },
]);
$resolver->setNormalizer('placeholder', $placeholderNormalizer);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php b/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php
index 758ef08bb9..5cabf16658 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php
@@ -121,6 +121,11 @@ class CollectionType extends AbstractType
'entry_type' => TextType::class,
'entry_options' => [],
'delete_empty' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'The collection is invalid.';
+ },
]);
$resolver->setNormalizer('entry_options', $entryOptionsNormalizer);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php b/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php
index b4fe44d0e6..f4cc05247e 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php
@@ -16,6 +16,7 @@ use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
@@ -69,6 +70,11 @@ class ColorType extends AbstractType
{
$resolver->setDefaults([
'html5' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid color.';
+ },
]);
$resolver->setAllowedTypes('html5', 'bool');
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php b/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php
index d2d3aee80a..e0b1976864 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php
@@ -37,6 +37,11 @@ class CountryType extends AbstractType
'choice_translation_domain' => false,
'choice_translation_locale' => null,
'alpha3' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid country.';
+ },
]);
$resolver->setAllowedTypes('choice_translation_locale', ['null', 'string']);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php b/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php
index 4506bf488f..7b6f69f48b 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php
@@ -35,6 +35,11 @@ class CurrencyType extends AbstractType
},
'choice_translation_domain' => false,
'choice_translation_locale' => null,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid currency.';
+ },
]);
$resolver->setAllowedTypes('choice_translation_locale', ['null', 'string']);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php
index 2c41b1c6a3..13ba9d33db 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php
@@ -234,6 +234,11 @@ class DateIntervalType extends AbstractType
'compound' => $compound,
'empty_data' => $emptyData,
'labels' => [],
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please choose a valid date interval.';
+ },
]);
$resolver->setNormalizer('placeholder', $placeholderNormalizer);
$resolver->setNormalizer('labels', $labelsNormalizer);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php
index ec1e7fe387..14eb4bd691 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php
@@ -273,6 +273,11 @@ class DateTimeType extends AbstractType
return $options['compound'] ? [] : '';
},
'input_format' => 'Y-m-d H:i:s',
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid date and time.';
+ },
]);
// Don't add some defaults in order to preserve the defaults
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php
index f7a55ffe74..f12b006b4a 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php
@@ -299,6 +299,11 @@ class DateType extends AbstractType
},
'choice_translation_domain' => false,
'input_format' => 'Y-m-d',
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid date.';
+ },
]);
$resolver->setNormalizer('placeholder', $placeholderNormalizer);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php b/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php
index 1bc1019ab9..1bd093cf00 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php
@@ -12,9 +12,25 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolver;
class EmailType extends AbstractType
{
+ /**
+ * {@inheritdoc}
+ */
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults(array(
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid email address.';
+ },
+ ));
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php
index ce535394d9..7840b74935 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php
@@ -130,6 +130,11 @@ class FileType extends AbstractType
'empty_data' => $emptyData,
'multiple' => false,
'allow_file_upload' => true,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid file.';
+ },
]);
}
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php
index 6ef9159c23..d8e219ed26 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php
@@ -199,6 +199,8 @@ class FormType extends BaseType
'help_attr' => [],
'help_html' => false,
'help_translation_parameters' => [],
+ 'invalid_message' => 'This value is not valid.',
+ 'invalid_message_parameters' => [],
'is_empty_callback' => null,
]);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php b/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php
index dae7f2bd3d..f4258ec011 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class HiddenType extends AbstractType
@@ -27,6 +28,11 @@ class HiddenType extends AbstractType
// Pass errors to the parent
'error_bubbling' => true,
'compound' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'The hidden field is invalid.';
+ },
]);
}
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php b/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php
index dfea5074ca..27e3224d70 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php
@@ -16,6 +16,7 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStri
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class IntegerType extends AbstractType
@@ -48,6 +49,11 @@ class IntegerType extends AbstractType
// Integer cast rounds towards 0, so do the same when displaying fractions
'rounding_mode' => \NumberFormatter::ROUND_DOWN,
'compound' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter an integer.';
+ },
]);
$resolver->setAllowedValues('rounding_mode', [
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php b/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php
index c5d1ac0977..23e5e50319 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php
@@ -54,6 +54,11 @@ class LanguageType extends AbstractType
'choice_translation_locale' => null,
'alpha3' => false,
'choice_self_translation' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid language.';
+ },
]);
$resolver->setAllowedTypes('choice_self_translation', ['bool']);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php b/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php
index 8c1c2890a0..461640deeb 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php
@@ -35,6 +35,11 @@ class LocaleType extends AbstractType
},
'choice_translation_domain' => false,
'choice_translation_locale' => null,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid locale.';
+ },
]);
$resolver->setAllowedTypes('choice_translation_locale', ['null', 'string']);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php b/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php
index a6a46ee58b..51e7336590 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php
@@ -16,6 +16,7 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\MoneyToLocalizedString
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MoneyType extends AbstractType
@@ -57,6 +58,11 @@ class MoneyType extends AbstractType
'divisor' => 1,
'currency' => 'EUR',
'compound' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid money amount.';
+ },
]);
$resolver->setAllowedValues('rounding_mode', [
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php b/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php
index 0c434bee3a..2f6ac6cc2a 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php
@@ -63,6 +63,11 @@ class NumberType extends AbstractType
'compound' => false,
'input' => 'number',
'html5' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a number.';
+ },
]);
$resolver->setAllowedValues('rounding_mode', [
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php b/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php
index a11708084f..779f94d43b 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php
@@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PasswordType extends AbstractType
@@ -36,6 +37,11 @@ class PasswordType extends AbstractType
$resolver->setDefaults([
'always_empty' => true,
'trim' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'The password is invalid.';
+ },
]);
}
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php
index 9e89ca2d53..6ec9186424 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php
@@ -57,6 +57,11 @@ class PercentType extends AbstractType
'symbol' => '%',
'type' => 'fractional',
'compound' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a percentage value.';
+ },
]);
$resolver->setAllowedValues('type', [
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/RadioType.php b/src/Symfony/Component/Form/Extension/Core/Type/RadioType.php
index 471075b9a6..90f9bb71d3 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/RadioType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/RadioType.php
@@ -12,9 +12,25 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolver;
class RadioType extends AbstractType
{
+ /**
+ * {@inheritdoc}
+ */
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults(array(
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid option.';
+ },
+ ));
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php b/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php
index 36ecdb96da..5d6002938a 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php
@@ -12,9 +12,25 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolver;
class RangeType extends AbstractType
{
+ /**
+ * {@inheritdoc}
+ */
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults(array(
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please choose a valid range.';
+ },
+ ));
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/RepeatedType.php b/src/Symfony/Component/Form/Extension/Core/Type/RepeatedType.php
index 6ed403523c..16fa1a7bb7 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/RepeatedType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/RepeatedType.php
@@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\DataTransformer\ValueToDuplicatesTransformer;
use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class RepeatedType extends AbstractType
@@ -57,6 +58,11 @@ class RepeatedType extends AbstractType
'first_name' => 'first',
'second_name' => 'second',
'error_bubbling' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'The values do not match.';
+ },
]);
$resolver->setAllowedTypes('options', 'array');
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php b/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php
index c817a26d02..cbf852cb01 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php
@@ -12,9 +12,25 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolver;
class SearchType extends AbstractType
{
+ /**
+ * {@inheritdoc}
+ */
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults(array(
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid search term.';
+ },
+ ));
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TelType.php b/src/Symfony/Component/Form/Extension/Core/Type/TelType.php
index de74a3ed37..13d3179e49 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/TelType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/TelType.php
@@ -12,9 +12,25 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\Options;
+use Symfony\Component\OptionsResolver\OptionsResolver;
class TelType extends AbstractType
{
+ /**
+ * {@inheritdoc}
+ */
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults(array(
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please provide a valid phone number.';
+ },
+ ));
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php
index b3d0d5ef65..d4e10f53eb 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php
@@ -336,6 +336,11 @@ class TimeType extends AbstractType
},
'compound' => $compound,
'choice_translation_domain' => false,
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid time.';
+ },
]);
$resolver->setNormalizer('view_timezone', function (Options $options, $viewTimezone): ?string {
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php
index 1aba449665..9829cba2cd 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php
@@ -61,6 +61,12 @@ class TimezoneType extends AbstractType
'choice_translation_domain' => false,
'choice_translation_locale' => null,
'input' => 'string',
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please select a valid timezone.';
+ },
+ 'regions' => \DateTimeZone::ALL,
]);
$resolver->setAllowedTypes('intl', ['bool']);
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TransformationFailureExtension.php b/src/Symfony/Component/Form/Extension/Core/Type/TransformationFailureExtension.php
index f93586ef73..f766633c9b 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/TransformationFailureExtension.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/TransformationFailureExtension.php
@@ -30,7 +30,7 @@ class TransformationFailureExtension extends AbstractTypeExtension
public function buildForm(FormBuilderInterface $builder, array $options)
{
- if (!isset($options['invalid_message']) && !isset($options['invalid_message_parameters'])) {
+ if (!isset($options['constraints'])) {
$builder->addEventSubscriber(new TransformationFailureListener($this->translator));
}
}
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php b/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php
index b0392a9849..f294a10ac2 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php
@@ -16,6 +16,7 @@ use Symfony\Component\Form\Extension\Core\EventListener\FixUrlProtocolListener;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UrlType extends AbstractType
@@ -46,7 +47,14 @@ class UrlType extends AbstractType
*/
public function configureOptions(OptionsResolver $resolver)
{
- $resolver->setDefault('default_protocol', 'http');
+ $resolver->setDefaults([
+ 'default_protocol' => 'http',
+ 'invalid_message' => function (Options $options, $previousValue) {
+ return ($options['legacy_error_messages'] ?? true)
+ ? $previousValue
+ : 'Please enter a valid URL.';
+ },
+ ]);
$resolver->setAllowedTypes('default_protocol', ['null', 'string']);
}
diff --git a/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php b/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php
index 9de782ffc9..05e21de1f0 100644
--- a/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php
+++ b/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php
@@ -26,11 +26,13 @@ class FormTypeValidatorExtension extends BaseValidatorExtension
{
private $validator;
private $violationMapper;
+ private $legacyErrorMessages;
- public function __construct(ValidatorInterface $validator)
+ public function __construct(ValidatorInterface $validator, bool $legacyErrorMessages = true)
{
$this->validator = $validator;
$this->violationMapper = new ViolationMapper();
+ $this->legacyErrorMessages = $legacyErrorMessages;
}
/**
@@ -58,9 +60,18 @@ class FormTypeValidatorExtension extends BaseValidatorExtension
'constraints' => [],
'invalid_message' => 'This value is not valid.',
'invalid_message_parameters' => [],
+ 'legacy_error_messages' => $this->legacyErrorMessages,
'allow_extra_fields' => false,
'extra_fields_message' => 'This form should not contain extra fields.',
]);
+ $resolver->setAllowedTypes('legacy_error_messages', 'bool');
+ $resolver->setDeprecated('legacy_error_messages', 'symfony/form', '5.2', function (Options $options, $value) {
+ if ($value === true) {
+ return 'Setting the "legacy_error_messages" option to "true" is deprecated. It will be disabled in Symfony 6.0.';
+ }
+
+ return '';
+ });
$resolver->setNormalizer('constraints', $constraintsNormalizer);
}
diff --git a/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php b/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php
index ac2d61238f..6c1d9bb905 100644
--- a/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php
+++ b/src/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php
@@ -25,9 +25,12 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
class ValidatorExtension extends AbstractExtension
{
private $validator;
+ private $legacyErrorMessages;
- public function __construct(ValidatorInterface $validator)
+ public function __construct(ValidatorInterface $validator, bool $legacyErrorMessages = true)
{
+ $this->legacyErrorMessages = $legacyErrorMessages;
+
$metadata = $validator->getMetadataFor('Symfony\Component\Form\Form');
// Register the form constraints in the validator programmatically.
@@ -50,7 +53,7 @@ class ValidatorExtension extends AbstractExtension
protected function loadTypeExtensions()
{
return [
- new Type\FormTypeValidatorExtension($this->validator),
+ new Type\FormTypeValidatorExtension($this->validator, $this->legacyErrorMessages),
new Type\RepeatedTypeValidatorExtension(),
new Type\SubmitTypeValidatorExtension(),
];
diff --git a/src/Symfony/Component/Form/Resources/translations/validators.en.xlf b/src/Symfony/Component/Form/Resources/translations/validators.en.xlf
index 89814258d1..97ed83fd47 100644
--- a/src/Symfony/Component/Form/Resources/translations/validators.en.xlf
+++ b/src/Symfony/Component/Form/Resources/translations/validators.en.xlf
@@ -18,6 +18,102 @@
This value is not a valid HTML5 color.
+
+
+ Please enter a valid birthdate.
+
+
+
+ The selected choice is invalid.
+
+
+
+ The collection is invalid.
+
+
+
+ Please select a valid color.
+
+
+
+ Please select a valid country.
+
+
+
+ Please select a valid currency.
+
+
+
+ Please choose a valid date interval.
+
+
+
+ Please enter a valid date and time.
+
+
+
+ Please enter a valid date.
+
+
+
+ Please select a valid file.
+
+
+
+ The hidden field is invalid.
+
+
+
+ Please enter an integer.
+
+
+
+ Please select a valid language.
+
+
+
+ Please select a valid locale.
+
+
+
+ Please enter a valid money amount.
+
+
+
+ Please enter a number.
+
+
+
+ The password is invalid.
+
+
+
+ Please enter a percentage value.
+
+
+
+ The values do not match.
+
+
+
+ Please enter a valid time.
+
+
+
+ Please select a valid timezone.
+
+
+
+ Please enter a valid URL.
+
+
+
+ Please enter a valid search term.
+
+
+
+ Please provide a valid phone number.
+