diff --git a/ModelDescriber/Annotations/SymfonyConstraintAnnotationReader.php b/ModelDescriber/Annotations/SymfonyConstraintAnnotationReader.php index ccd9cb0..af1ade0 100644 --- a/ModelDescriber/Annotations/SymfonyConstraintAnnotationReader.php +++ b/ModelDescriber/Annotations/SymfonyConstraintAnnotationReader.php @@ -48,6 +48,11 @@ class SymfonyConstraintAnnotationReader foreach ($annotations as $annotation) { if ($annotation instanceof Assert\NotBlank || $annotation instanceof Assert\NotNull) { + if ($annotation instanceof Assert\NotBlank && $annotation->allowNull) { + // The field is optional + continue; + } + // The field is required if (null === $this->schema) { continue; diff --git a/Tests/ModelDescriber/Annotations/SymfonyConstraintAnnotationReaderTest.php b/Tests/ModelDescriber/Annotations/SymfonyConstraintAnnotationReaderTest.php index 42f6e96..f6a3c1c 100644 --- a/Tests/ModelDescriber/Annotations/SymfonyConstraintAnnotationReaderTest.php +++ b/Tests/ModelDescriber/Annotations/SymfonyConstraintAnnotationReaderTest.php @@ -47,6 +47,34 @@ class SymfonyConstraintAnnotationReaderTest extends TestCase $this->assertEquals($schema->required, ['property1', 'property2']); } + public function testOptionalProperty() + { + $entity = new class() { + /** + * @Assert\NotBlank(allowNull = true) + * @Assert\Length(min = 1) + */ + private $property1; + /** + * @Assert\NotBlank() + */ + private $property2; + }; + + $schema = new Schema(); + $schema->getProperties()->set('property1', new Schema()); + $schema->getProperties()->set('property2', new Schema()); + + $symfonyConstraintAnnotationReader = new SymfonyConstraintAnnotationReader(new AnnotationReader()); + $symfonyConstraintAnnotationReader->setSchema($schema); + + $symfonyConstraintAnnotationReader->updateProperty(new \ReflectionProperty($entity, 'property1'), $schema->getProperties()->get('property1')); + $symfonyConstraintAnnotationReader->updateProperty(new \ReflectionProperty($entity, 'property2'), $schema->getProperties()->get('property2')); + + // expect required to be numeric array with sequential keys (not [0 => ..., 2 => ...]) + $this->assertEquals($schema->getRequired(), ['property2']); + } + public function testAssertChoiceResultsInNumericArray() { define('TEST_ASSERT_CHOICE_STATUSES', [