8000 minor #51455 [FrameworkBundle][Validator] Remove remaining deprecatio… · symfony/symfony@056c66e · GitHub
[go: up one dir, main page]

Skip to content

Commit 056c66e

Browse files
minor #51455 [FrameworkBundle][Validator] Remove remaining deprecations (alexandre-daubois)
This PR was merged into the 7.0 branch. Discussion ---------- [FrameworkBundle][Validator] Remove remaining deprecations | Q | A | ------------- | --- | Branch? | 7.0 | Bug fix? | no | New feature? | no <!-- please update src/**/CHANGELOG.md files --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tickets | - | License | MIT | Doc PR | symfony/symfony-docs#18781 Follow-up of #51425 Commits ------- 6e8cab7 [FrameworkBundle][Validator] Remove remaining deprecations
2 parents 695c02d + 6e8cab7 commit 056c66e

File tree

18 files changed

+100
-188
lines changed

18 files changed

+100
-188
lines changed

UPGRADE-7.0.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ FrameworkBundle
210210
* Make the `framework.uid.default_uuid_version` config option default to `7`
211211
* Make the `framework.uid.time_based_uuid_version` config option default to `7`
212212
* Make the `framework.validation.email_validation_mode` config option default to `html5`
213+
* Remove the `framework.validation.enable_annotations` config option, use `framework.validation.enable_attributes` instead
214+
* Remove the `framework.serializer.enable_annotations` config option, use `framework.serializer.enable_attributes` instead
213215

214216
HttpFoundation
215217
--------------
@@ -472,9 +474,11 @@ Validator
472474
* Remove `VALIDATION_MODE_LOOSE` from `Email` constraint, use `VALIDATION_MODE_HTML5` instead
473475
* Remove constraint `ExpressionLanguageSyntax`, use `ExpressionSyntax` instead
474476
* Remove Doctrine annotations support in favor of native attributes
475-
* Remove the annotation reader parameter from the constructor signature of `AnnotationLoader`
476477
* Remove `ValidatorBuilder::setDoctrineAnnotationReader()`
477478
* Remove `ValidatorBuilder::addDefaultDoctrineAnnotationReader()`
479+
* Remove `ValidatorBuilder::enableAnnotationMapping()`, use `ValidatorBuilder::enableAttributeMapping()` instead
480+
* Remove `ValidatorBuilder::disableAnnotationMapping()`, use `ValidatorBuilder::disableAttributeMapping()` instead
481+
* Remove `AnnotationLoader`, use `AttributeLoader` instead
478482

479483
VarDumper
480484
---------

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ CHANGELOG
2222
* Make the `framework.uid.default_uuid_version` config option default to `7`
2323
* Make the `framework.uid.time_based_uuid_version` config option default to `7`
2424
* Make the `framework.validation.email_validation_mode` config option default to `html5`
25+
* Remove the `framework.validation.enable_annotations` config option, use `framework.validation.enable_attributes` instead
26+
* Remove the `framework.serializer.enable_annotations` config option, use `framework.serializer.enable_attributes` instead
2527

2628
6.4
2729
---

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,6 @@ private function addValidationSection(ArrayNodeDefinition $rootNode, callable $e
989989
->{$enableIfStandalone('symfony/validator', Validation::class)}()
990990
->children()
991991
->scalarNode('cache')->end()
992-
->booleanNode('enable_annotations')->end()
993992
->booleanNode('enable_attributes')->{!class_exists(FullStack::class) ? 'defaultTrue' : 'defaultFalse'}()->end()
994993
->arrayNode('static_method')
995994
->defaultValue(['loadValidatorMetadata'])
@@ -1090,24 +1089,9 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode, callable $e
10901089
$rootNode
10911090
->children()
10921091
->arrayNode('serializer')
1093-
->validate()
1094-
->always(function ($v) {
1095-
if (isset($v['enable_annotations'])) {
1096-
trigger_deprecation('symfony/framework-bundle', '6.4', 'Option "enable_annotations" at "framework.serializer" is deprecated. Use the "enable_attributes" option instead.');
1097-
1098-
if (!isset($v['enable_attributes'])) {
1099-
$v['enable_attributes'] = $v['enable_annotations'];
1100-
} else {
1101-
throw new LogicException('The "enable_annotations" and "enable_attributes" options at path "framework.serializer" must not be both set. Only the "enable_attributes" option must be used.');
1102-
}
1103-
}
1104-
1105-
return $v;
1106-
})->end()
11071092
->info('serializer configuration')
11081093
->{$enableIfStandalone('symfony/serializer', Serializer::class)}()
11091094
->children()
1110-
->booleanNode('enable_annotations')->end()
11111095
->booleanNode('enable_attributes')->{!class_exists(FullStack::class) ? 'defaultTrue' : 'defaultFalse'}()->end()
11121096
->scalarNode('name_converter')->end()
11131097
->scalarNode('circular_reference_handler')->end()

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@
266266

267267
<xsd:attribute name="enabled" type="xsd:boolean" />
268268
<xsd:attribute name="cache" type="xsd:string" />
269-
<xsd:attribute name="enable-annotations" type="xsd:boolean" />
270269
<xsd:attribute name="enable-attributes" type="xsd:boolean" />
271270
<xsd:attribute name="static-method" type="xsd:boolean" />
272271
<xsd:attribute name="translation-domain" type="xsd:string" />
@@ -320,7 +319,6 @@
320319
<xsd:element name="default-context" type="metadata" minOccurs="0" maxOccurs="1" />
321320
</xsd:choice>
322321
<xsd:attribute name="enabled" type="xsd:boolean" />
323-
<xsd:attribute name="enable-annotations" type="xsd:boolean" />
324322
<xsd:attribute name="enable-attributes" type="xsd:boolean" />
325323
<xsd:attribute name="name-converter" type="xsd:string" />
326324
<xsd:attribute name="circular-reference-handler" type="xsd:string" />

src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public function testDenormalizeWithNestedAttributesWithoutMetadata()
142142

143143
public function testDenormalizeWithSnakeCaseNestedAttributes()
144144
{
145-
$factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
145+
$factory = new ClassMetadataFactory(new AnnotationLoader());
146146
$normalizer = new ObjectNormalizer($factory, new CamelCaseToSnakeCaseNameConverter());
147147
$data = [
148148
'one' => [
@@ -155,7 +155,7 @@ public function testDenormalizeWithSnakeCaseNestedAttributes()
155155

156156
public function testNormalizeWithSnakeCaseNestedAttributes()
157157
{
158-
$factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
158+
$factory = new ClassMetadataFactory(new AnnotationLoader());
159159
$normalizer = new ObjectNormalizer($factory, new CamelCaseToSnakeCaseNameConverter());
160160
$dummy = new SnakeCaseNestedDummy();
161161
$dummy->fooBar = 'fooBar';

src/Symfony/Component/Validator/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ CHANGELOG
1515
* Remove the annotation reader parameter from the constructor signature of `AnnotationLoader`
1616
* Remove `ValidatorBuilder::setDoctrineAnnotationReader()`
1717
* Remove `ValidatorBuilder::addDefaultDoctrineAnnotationReader()`
18+
* Remove `ValidatorBuilder::enableAnnotationMapping()`, use `ValidatorBuilder::enableAttributeMapping()` instead
19+
* Remove `ValidatorBuilder::disableAnnotationMapping()`, use `ValidatorBuilder::disableAttributeMapping()` instead
20+
* Remove `AnnotationLoader`, use `AttributeLoader` instead
1821

1922
6.4
2023
---

src/Symfony/Component/Validator/Constraints/Callback.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class Callback extends Constraint
2626

2727
public function __construct(array|string|callable $callback = null, array $groups = null, mixed $payload = null, array $options = [])
2828
{
29-
// Invocation through annotations with an array parameter only
29+
// Invocation through attributes with an array parameter only
3030
if (\is_array($callback) && 1 === \count($callback) && isset($callback['value'])) {
3131
$callback = $callback['value'];
3232
}

src/Symfony/Component/Validator/Constraints/When.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
use Symfony\Component\Validator\Constraint;
1717
use Symfony\Component\Validator\Exception\LogicException;
1818

19-
/**
20-
* @Target({"CLASS", "PROPERTY", "METHOD", "ANNOTATION"})
21-
*/
2219
#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
2320
class When extends Composite
2421
{

src/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php

Lines changed: 0 additions & 96 deletions
This file was deleted.

src/Symfony/Component/Validator/Mapping/Loader/AttributeLoader.php

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,85 @@
1111

1212
namespace Symfony\Component\Validator\Mapping\Loader;
1313

14+
use Symfony\Component\Validator\Constraint;
15+
use Symfony\Component\Validator\Constraints\Callback;
16+
use Symfony\Component\Validator\Constraints\GroupSequence;
17+
use Symfony\Component\Validator\Constraints\GroupSequenceProvider;
18+
use Symfony\Component\Validator\Exception\MappingException;
19+
use Symfony\Component\Validator\Mapping\ClassMetadata;
20+
1421
/**
1522
* Loads validation metadata using PHP attributes.
1623
*
1724
* @author Bernhard Schussek <bschussek@gmail.com>
1825
* @author Alexander M. Turek <me@derrabus.de>
1926
* @author Alexandre Daubois <alex.daubois@gmail.com>
2027
*/
21-
class AttributeLoader extends AnnotationLoader
28+
class AttributeLoader implements LoaderInterface
2229
{
23-
public function __construct()
30+
public function loadClassMetadata(ClassMetadata $metadata): bool
31+
{
32+
$reflClass = $metadata->getReflectionClass();
33+
$className = $reflClass->name;
34+
$success = false;
35+
36+
foreach ($this->getAttributes($reflClass) as $constraint) {
37+
if ($constraint instanceof GroupSequence) {
38+
$metadata->setGroupSequence($constraint->groups);
39+
} elseif ($constraint instanceof GroupSequenceProvider) {
40+
$metadata->setGroupSequenceProvider(true);
41+
} elseif ($constraint instanceof Constraint) {
42+
$metadata->addConstraint($constraint);
43+
}
44+
45+
$success = true;
46+
}
47+
48+
foreach ($reflClass->getProperties() as $property) {
49+
if ($property->getDeclaringClass()->name === $className) {
50+
foreach ($this->getAttributes($property) as $constraint) {
51+
if ($constraint instanceof Constraint) {
52+
$metadata->addPropertyConstraint($property->name, $constraint);
53+
}
54+
55+
$success = true;
56+
}
57+
}
58+
}
59+
60+
foreach ($reflClass->getMethods() as $method) {
61+
if ($method->getDeclaringClass()->name === $className) {
62+
foreach ($this->getAttributes($method) as $constraint) {
63+
if ($constraint instanceof Callback) {
64+
$constraint->callback = $method->getName();
65+
66+
$metadata->addConstraint($constraint);
67+
} elseif ($constraint instanceof Constraint) {
68+
if (preg_match('/^(get|is|has)(.+)$/i', $method->name, $matches)) {
69+
$metadata->addGetterMethodConstraint(lcfirst($matches[2]), $matches[0], $constraint);
70+
} else {
71+
throw new MappingException(sprintf('The constraint on "%s::%s()" cannot be added. Constraints can only be added on methods beginning with "get", "is" or "has".', $className, $method->name));
72+
}
73+
}
74+
75+
$success = true;
76+
}
77+
}
78+
}
79+
80+
return $success;
81+
}
82+
83+
private function getAttributes(\ReflectionMethod|\ReflectionClass|\ReflectionProperty $reflection): iterable
2484
{
25-
parent::__construct(null);
85+
foreach ($reflection->getAttributes(GroupSequence::class) as $attribute) {
86+
yield $attribute->newInstance();
87+
}
88+
foreach ($reflection->getAttributes(GroupSequenceProvider::class) as $attribute) {
89+
yield $attribute->newInstance();
90+
}
91+
foreach ($reflection->getAttributes(Constraint::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
92+
yield $attribute->newInstance();
93+
}
2694
}
2795
}

src/Symfony/Component/Validator/Tests/ConstraintTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ public function testOptionsWithInvalidInternalPointer()
245245
$this->assertEquals('foo', $constraint->property1);
246246
}
247247

248-
public function testAnnotationSetUndefinedDefaultOption()
248+
public function testAttributeSetUndefinedDefaultOption()
249249
{
250250
$this->expectException(ConstraintDefinitionException::class);
251251
$this->expectExceptionMessage('No default option is configured for constraint "Symfony\Component\Validator\Tests\Fixtures\ConstraintB".');

src/Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,22 +205,22 @@ public function testConstraintGetTargets()
205205
$this->assertEquals($targets, $constraint->getTargets());
206206
}
207207

208-
// Should succeed. Needed when defining constraints as annotations.
208+
// Should succeed. Needed when defining constraints as attributes.
209209
public function testNoConstructorArguments()
210210
{
211211
$constraint = new Callback();
212212

213213
$this->assertSame([Constraint::CLASS_CONSTRAINT, Constraint::PROPERTY_CONSTRAINT], $constraint->getTargets());
214214
}
215215

216-
public function testAnnotationInvocationSingleValued()
216+
public function testAttributeInvocationSingleValued()
217217
{
218218
$constraint = new Callback(['value' => 'validateStatic']);
219219

220220
$this->assertEquals(new Callback('validateStatic'), $constraint);
221221
}
222222

223-
public function testAnnotationInvocationMultiValued()
223+
public function testAttributeInvocationMultiValued()
224224
{
225225
$constraint = new Callback(['value' => [__CLASS__.'_Class', 'validateCallback']]);
226226

src/Symfony/Component/Validator/Tests/Constraints/CountValidatorTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public function testDefaultOption()
283283
$this->assertEquals(5, $constraint->max);
284284
}
285285

286-
public function testConstraintAnnotationDefaultOption()
286+
public function testConstraintAttributeDefaultOption()
287287
{
288288
$constraint = new Count(['value' => 5, 'exactMessage' => 'message']);
289289

src/Symfony/Component/Validator/Tests/Constraints/LengthTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function testConstraintDefaultOption()
7070
self::assertEquals(5, $constraint->max);
7171
}
7272

73-
public function testConstraintAnnotationDefaultOption()
73+
public function testConstraintAttributeDefaultOption()
7474
{
7575
$constraint = new Length(['value' => 5, 'exactMessage' => 'message']);
7676

src/Symfony/Component/Validator/Tests/Constraints/WhenTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
2020
use Symfony\Component\Validator\Exception\MissingOptionsException;
2121
use Symfony\Component\Validator\Mapping\ClassMetadata;
22-
use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
2322
use Symfony\Component\Validator\Mapping\Loader\AttributeLoader;
2423
use Symfony\Component\Validator\Tests\Constraints\Fixtures\WhenTestWithAttributes;
2524

0 commit comments

Comments
 (0)
0