Як валідувати необроблені значення (скалярні значення та масиви)
Дата оновлення перекладу 2023-06-15
Як валідувати необроблені значення (скалярні значення та масиви)
Зазвичай ви валідуватимете обʼєкти цілком. Але іноді вам потрібно буде валідувати просте значення - наприклад, переконатися в тому, що рядок є валідною адресою електронної пошти. Насправді це достатньо просто зробити. Зсередини контролера це виглядає наступним чином:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
// ...
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validator\ValidatorInterface;
// ...
public function addEmail($email, ValidatorInterface $validator)
{
$emailConstraint = new Assert\Email();
// всі "опції" обмеження можуть бути встановлені таким чином
$emailConstraint->message = 'Invalid email address';
// використати валідатор для валідації значення
$errors = $validator->validate(
$email,
$emailConstraint
);
if (!$errors->count()) {
// ... це валідна адреса електронної пошти, зробити щось
} else {
// це *не* валідна адреса електронної пошти
$errorMessage = $errors[0]->getMessage();
// ... зробити щось з помилкою
}
// ...
}
Викликавши у валідаторі validate
, ви можете передати необроблене значення та обʼєкт
обмеження, до якого ви хочете застосувати валідацію. Повний перелік доступних обмежень
- так само, як і повне імʼя класу для кожного обмеження - доступний у розділі
довідник обмежень.
Валідація масивів можлива з використанням обмеження Collection
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validation;
$validator = Validation::createValidator();
$input = [
'name' => [
'first_name' => 'Fabien',
'last_name' => 'Potencier',
],
'email' => 'test@email.tld',
'simple' => 'hello',
'eye_color' => 3,
'file' => null,
'password' => 'test',
'tags' => [
[
'slug' => 'symfony_doc',
'label' => 'symfony doc',
],
],
];
$groups = new Assert\GroupSequence(['Default', 'custom']);
$constraint = new Assert\Collection([
// ключі відповідають ключам у масиві введення
'name' => new Assert\Collection([
'first_name' => new Assert\Length(['min' => 101]),
'last_name' => new Assert\Length(['min' => 1]),
]),
'email' => new Assert\Email(),
'simple' => new Assert\Length(['min' => 102]),
'eye_color' => new Assert\Choice([3, 4]),
'file' => new Assert\File(),
'password' => new Assert\Length(['min' => 60]),
'tags' => new Assert\Optional([
new Assert\Type('array'),
new Assert\Count(['min' => 1]),
new Assert\All([
new Assert\Collection([
'slug' => [
new Assert\NotBlank(),
new Assert\Type(['type' => 'string']),
],
'label' => [
new Assert\NotBlank(),
],
]),
new CustomUniqueTagValidator(['groups' => 'custom']),
]),
]),
]);
$violations = $validator->validate($input, $constraint, $groups);
Метод validate()
повертає обʼєкт ConstraintViolationList,
яки поводить себе так само, як і масив помилок. Кожна помилка у колекції - це обʼєкт
ConstraintViolation, який містить повідомлення
про помилку у своєму методі getMessage()
.
Note
При використанні груп з обмеженням Колекції,
використовуйте, де доречно, обмеження Optional
, як пояснюється у його довідковій
документації.