[Validator] Add the divisibleBy option to the Count constraint
This commit is contained in:
parent
cde44fcad1
commit
8dfb7b2ad1
@ -8,6 +8,7 @@ CHANGELOG
|
|||||||
* added option `alpha3` to `Country` constraint
|
* added option `alpha3` to `Country` constraint
|
||||||
* allow to define a reusable set of constraints by extending the `Compound` constraint
|
* allow to define a reusable set of constraints by extending the `Compound` constraint
|
||||||
* added `Sequentially` constraint, to sequentially validate a set of constraints (any violation raised will prevent further validation of the nested constraints)
|
* added `Sequentially` constraint, to sequentially validate a set of constraints (any violation raised will prevent further validation of the nested constraints)
|
||||||
|
* added the `divisibleBy` option to the `Count` constraint
|
||||||
|
|
||||||
5.0.0
|
5.0.0
|
||||||
-----
|
-----
|
||||||
|
@ -24,17 +24,21 @@ class Count extends Constraint
|
|||||||
{
|
{
|
||||||
const TOO_FEW_ERROR = 'bef8e338-6ae5-4caf-b8e2-50e7b0579e69';
|
const TOO_FEW_ERROR = 'bef8e338-6ae5-4caf-b8e2-50e7b0579e69';
|
||||||
const TOO_MANY_ERROR = '756b1212-697c-468d-a9ad-50dd783bb169';
|
const TOO_MANY_ERROR = '756b1212-697c-468d-a9ad-50dd783bb169';
|
||||||
|
const NOT_DIVISIBLE_BY_ERROR = DivisibleBy::NOT_DIVISIBLE_BY;
|
||||||
|
|
||||||
protected static $errorNames = [
|
protected static $errorNames = [
|
||||||
self::TOO_FEW_ERROR => 'TOO_FEW_ERROR',
|
self::TOO_FEW_ERROR => 'TOO_FEW_ERROR',
|
||||||
self::TOO_MANY_ERROR => 'TOO_MANY_ERROR',
|
self::TOO_MANY_ERROR => 'TOO_MANY_ERROR',
|
||||||
|
self::NOT_DIVISIBLE_BY_ERROR => 'NOT_DIVISIBLE_BY_ERROR',
|
||||||
];
|
];
|
||||||
|
|
||||||
public $minMessage = 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.';
|
public $minMessage = 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.';
|
||||||
public $maxMessage = 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.';
|
public $maxMessage = 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.';
|
||||||
public $exactMessage = 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.';
|
public $exactMessage = 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.';
|
||||||
|
public $divisibleByMessage = 'The number of elements in this collection should be a multiple of {{ compared_value }}.';
|
||||||
public $min;
|
public $min;
|
||||||
public $max;
|
public $max;
|
||||||
|
public $divisibleBy;
|
||||||
|
|
||||||
public function __construct($options = null)
|
public function __construct($options = null)
|
||||||
{
|
{
|
||||||
@ -50,8 +54,8 @@ class Count extends Constraint
|
|||||||
|
|
||||||
parent::__construct($options);
|
parent::__construct($options);
|
||||||
|
|
||||||
if (null === $this->min && null === $this->max) {
|
if (null === $this->min && null === $this->max && null === $this->divisibleBy) {
|
||||||
throw new MissingOptionsException(sprintf('Either option "min" or "max" must be given for constraint %s', __CLASS__), ['min', 'max']);
|
throw new MissingOptionsException(sprintf('Either option "min", "max" or "divisibleBy" must be given for constraint %s', __CLASS__), ['min', 'max', 'divisibleBy']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,20 @@ class CountValidator extends ConstraintValidator
|
|||||||
->setPlural((int) $constraint->min)
|
->setPlural((int) $constraint->min)
|
||||||
->setCode(Count::TOO_FEW_ERROR)
|
->setCode(Count::TOO_FEW_ERROR)
|
||||||
->addViolation();
|
->addViolation();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $constraint->divisibleBy) {
|
||||||
|
$this->context
|
||||||
|
->getValidator()
|
||||||
|
->inContext($this->context)
|
||||||
|
->validate($count, [
|
||||||
|
new DivisibleBy([
|
||||||
|
'value' => $constraint->divisibleBy,
|
||||||
|
'message' => $constraint->divisibleByMessage,
|
||||||
|
]),
|
||||||
|
], $this->context->getGroup());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -370,6 +370,10 @@
|
|||||||
<source>This value is not a valid hostname.</source>
|
<source>This value is not a valid hostname.</source>
|
||||||
<target>This value is not a valid hostname.</target>
|
<target>This value is not a valid hostname.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="96">
|
||||||
|
<source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
|
||||||
|
<target>The number of elements in this collection should be a multiple of {{ compared_value }}.</target>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
@ -370,6 +370,10 @@
|
|||||||
<source>This value is not a valid hostname.</source>
|
<source>This value is not a valid hostname.</source>
|
||||||
<target>Cette valeur n'est pas un nom d'hôte valide.</target>
|
<target>Cette valeur n'est pas un nom d'hôte valide.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="96">
|
||||||
|
<source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
|
||||||
|
<target>Le nombre d'éléments de cette collection doit être un multiple de {{ compared_value }}.</target>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Tests\Constraints;
|
|||||||
|
|
||||||
use Symfony\Component\Validator\Constraints\Count;
|
use Symfony\Component\Validator\Constraints\Count;
|
||||||
use Symfony\Component\Validator\Constraints\CountValidator;
|
use Symfony\Component\Validator\Constraints\CountValidator;
|
||||||
|
use Symfony\Component\Validator\Constraints\DivisibleBy;
|
||||||
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
|
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -202,4 +203,23 @@ abstract class CountValidatorTest extends ConstraintValidatorTestCase
|
|||||||
$this->assertEquals(5, $constraint->max);
|
$this->assertEquals(5, $constraint->max);
|
||||||
$this->assertEquals('message', $constraint->exactMessage);
|
$this->assertEquals('message', $constraint->exactMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since the contextual validator is mocked, this test only asserts that it
|
||||||
|
// is called with the right DivisibleBy constraint.
|
||||||
|
public function testDivisibleBy()
|
||||||
|
{
|
||||||
|
$constraint = new Count([
|
||||||
|
'divisibleBy' => 123,
|
||||||
|
'divisibleByMessage' => 'foo {{ compared_value }}',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->expectValidateValue(0, 3, [new DivisibleBy([
|
||||||
|
'value' => 123,
|
||||||
|
'message' => 'foo {{ compared_value }}',
|
||||||
|
])], $this->group);
|
||||||
|
|
||||||
|
$this->validator->validate(['foo', 'bar', 'ccc'], $constraint);
|
||||||
|
|
||||||
|
$this->assertNoViolation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user