Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

[Form] Restored and deprecated method `guessMinLength` in FormTypeGue…

…sser
  • Loading branch information...
commit 6f40676a3a8c4de6ab6a0389357af69e4b004b65 1 parent bcd7309
@webmozart webmozart authored
View
11 Extension/Validator/ValidatorTypeGuesser.php
@@ -68,6 +68,13 @@ public function guessMaxLength($class, $property)
/**
* {@inheritDoc}
*/
+ public function guessMinLength($class, $property)
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function guessPattern($class, $property)
{
$guesser = $this;
@@ -206,7 +213,7 @@ public function guessMaxLengthForConstraint(Constraint $constraint)
/**
* Guesses a field's pattern based on the given constraint
- *
+ *
* @param Constraint $constraint The constraint to guess for
*
* @return Guess The guess for the pattern
@@ -228,7 +235,7 @@ public function guessPatternForConstraint(Constraint $constraint)
case 'Symfony\Component\Validator\Constraints\Size':
return new ValueGuess(sprintf('.{%s,%s}', strlen((string) $constraint->min), strlen((string) $constraint->max)), Guess::LOW_CONFIDENCE);
-
+
case 'Symfony\Component\Validator\Constraints\Type':
if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) {
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
View
16 FormFactory.php
@@ -327,24 +327,32 @@ public function createBuilderForProperty($class, $property, $data = null, array
$typeGuess = $this->guesser->guessType($class, $property);
$maxLengthGuess = $this->guesser->guessMaxLength($class, $property);
+ // Keep $minLengthGuess for BC until Symfony 2.3
+ $minLengthGuess = $this->guesser->guessMinLength($class, $property);
$requiredGuess = $this->guesser->guessRequired($class, $property);
$patternGuess = $this->guesser->guessPattern($class, $property);
$type = $typeGuess ? $typeGuess->getType() : 'text';
$maxLength = $maxLengthGuess ? $maxLengthGuess->getValue() : null;
+ $minLength = $minLengthGuess ? $minLengthGuess->getValue() : null;
$pattern = $patternGuess ? $patternGuess->getValue() : null;
+ // overrides $minLength, if set
+ if (null !== $pattern) {
+ $options = array_merge(array('pattern' => $pattern), $options);
+ }
+
if (null !== $maxLength) {
$options = array_merge(array('max_length' => $maxLength), $options);
}
- if ($requiredGuess) {
- $options = array_merge(array('required' => $requiredGuess->getValue()), $options);
+ if (null !== $minLength && $minLength > 0) {
+ $options = array_merge(array('pattern' => '.{'.$minLength.','.$maxLength.'}'), $options);
}
- if (null !== $pattern) {
- $options = array_merge(array('pattern' => $pattern), $options);
+ if ($requiredGuess) {
+ $options = array_merge(array('required' => $requiredGuess->getValue()), $options);
}
// user options may override guessed options
View
10 FormTypeGuesserChain.php
@@ -73,6 +73,16 @@ public function guessMaxLength($class, $property)
/**
* {@inheritDoc}
*/
+ public function guessMinLength($class, $property)
+ {
+ return $this->guess(function ($guesser) use ($class, $property) {
+ return $guesser->guessMinLength($class, $property);
+ });
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function guessPattern($class, $property)
{
return $this->guess(function ($guesser) use ($class, $property) {
View
14 FormTypeGuesserInterface.php
@@ -44,8 +44,20 @@ function guessRequired($class, $property);
function guessMaxLength($class, $property);
/**
+ * Returns a guess about the field's minimum length
+ *
+ * @param string $class The fully qualified class name
+ * @param string $property The name of the property to guess for
+ *
+ * @return Guess A guess for the field's minimum length
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+ function guessMinLength($class, $property);
+
+ /**
* Returns a guess about the field's pattern
- *
+ *
* - When you have a min value, you guess a min length of this min (LOW_CONFIDENCE) , lines below
* - If this value is a float type, this is wrong so you guess null with MEDIUM_CONFIDENCE to override the previous guess.
* Example:
View
68 Tests/FormFactoryTest.php
@@ -458,6 +458,74 @@ public function testCreateBuilderUsesMaxLengthIfFound()
$this->assertEquals('builderInstance', $builder);
}
+ public function testCreateBuilderUsesMinLengthIfFound()
+ {
+ $this->guesser1->expects($this->once())
+ ->method('guessMinLength')
+ ->with('Application\Author', 'firstName')
+ ->will($this->returnValue(new ValueGuess(
+ 2,
+ Guess::MEDIUM_CONFIDENCE
+ )));
+
+ $this->guesser2->expects($this->once())
+ ->method('guessMinLength')
+ ->with('Application\Author', 'firstName')
+ ->will($this->returnValue(new ValueGuess(
+ 5,
+ Guess::HIGH_CONFIDENCE
+ )));
+
+ $factory = $this->createMockFactory(array('createNamedBuilder'));
+
+ $factory->expects($this->once())
+ ->method('createNamedBuilder')
+ ->with('text', 'firstName', null, array('pattern' => '.{5,}'))
+ ->will($this->returnValue('builderInstance'));
+
+ $builder = $factory->createBuilderForProperty(
+ 'Application\Author',
+ 'firstName'
+ );
+
+ $this->assertEquals('builderInstance', $builder);
+ }
+
+ public function testCreateBuilderPrefersPatternOverMinLength()
+ {
+ // min length is deprecated
+ $this->guesser1->expects($this->once())
+ ->method('guessMinLength')
+ ->with('Application\Author', 'firstName')
+ ->will($this->returnValue(new ValueGuess(
+ 2,
+ Guess::HIGH_CONFIDENCE
+ )));
+
+ // pattern is preferred even though confidence is lower
+ $this->guesser2->expects($this->once())
+ ->method('guessPattern')
+ ->with('Application\Author', 'firstName')
+ ->will($this->returnValue(new ValueGuess(
+ '.{5,10}',
+ Guess::LOW_CONFIDENCE
+ )));
+
+ $factory = $this->createMockFactory(array('createNamedBuilder'));
+
+ $factory->expects($this->once())
+ ->method('createNamedBuilder')
+ ->with('text', 'firstName', null, array('pattern' => '.{5,10}'))
+ ->will($this->returnValue('builderInstance'));
+
+ $builder = $factory->createBuilderForProperty(
+ 'Application\Author',
+ 'firstName'
+ );
+
+ $this->assertEquals('builderInstance', $builder);
+ }
+
public function testCreateBuilderUsesRequiredSettingWithHighestConfidence()
{
$this->guesser1->expects($this->once())
Please sign in to comment.
Something went wrong with that request. Please try again.