Правило Count
Правило Count относится к группе ограничений валидации Symfony и применяется для проверки количества элементов в коллекции, массиве или объекте, реализующем интерфейс Countable. Правило вешается на свойство сущности или на поле формы. Первым параметром передаётся точное количество элементов, которое должно быть в коллекции. Также можно передать минимальное значение через опцию min и максимальное через опцию max. Если количество элементов не соответствует заданным ограничениям, валидация завершается ошибкой.
Синтаксис
#[Count(
exactly: value,
min: value,
max: value,
divisibleBy: value,
minMessage: 'message',
maxMessage: 'message',
exactMessage: 'message',
divisibleByMessage: 'message'
)]
Пример
Давайте создадим сущность Article с полем tags, которое должно содержать ровно три элемента:
<?php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Article
{
#[Assert\Count(
exactly: 3,
exactMessage: 'The tags collection must contain exactly {{ limit }} elements.'
)]
private array $tags = [];
public function getTags(): array
{
return $this->tags;
}
public function setTags(array $tags): self
{
$this->tags = $tags;
return $this;
}
}
?>
Пример
Давайте проверим сущность с корректным количеством элементов:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class ArticleController extends AbstractController
{
#[Route('/article/validate', name: 'article_validate')]
public function validate(ValidatorInterface $validator): Response
{
$article = new Article();
$article->setTags(['a', 'b', 'c']);
$errors = $validator->validate($article);
if (count($errors) > 0) {
return new Response((string) $errors);
}
return new Response('valid');
}
}
?>
Результат выполнения кода:
"valid"
Пример
Давайте проверим сущность с некорректным количеством элементов:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class ArticleController extends AbstractController
{
#[Route('/article/validate-invalid', name: 'article_validate_invalid')]
public function validateInvalid(ValidatorInterface $validator): Response
{
$article = new Article();
$article->setTags(['a', 'b']);
$errors = $validator->validate($article);
if (count($errors) > 0) {
return new Response((string) $errors);
}
return new Response('valid');
}
}
?>
Результат выполнения кода:
"The tags collection must contain exactly 3 elements."
Пример
Давайте зададим минимальное и максимальное количество элементов через опции min и max:
<?php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Article
{
#[Assert\Count(
min: 2,
max: 5,
minMessage: 'The tags collection must contain at least {{ limit }} elements.',
maxMessage: 'The tags collection must contain at most {{ limit }} elements.'
)]
private array $tags = [];
public function getTags(): array
{
return $this->tags;
}
public function setTags(array $tags): self
{
$this->tags = $tags;
return $this;
}
}
?>
Пример
Давайте применим правило Count к полю формы через атрибут constraints:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Count;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('tags', CollectionType::class, [
'entry_type' => TextType::class,
'constraints' => [
new Count([
'exactly' => 3,
'exactMessage' => 'The tags collection must contain exactly {{ limit }} elements.',
]),
],
]);
}
}
?>