Мне нужно проверить массив. И я также должен проверить значения в этом массиве.
Например, я хочу проверить каждую из этих записей и только эту. Если у меня есть что-нибудь еще, я хочу ошибку. Но я могу отправить только одну запись, если захочу. Как я могу это подтвердить?
"workDaysInput": [
"full-week",
"partial-week-3-4",
"partial-week-1-2",
"night-and-weekend"
],
Решено делать:
(спасибо @andrew-hutchings)
#[Groups(['offer:write'])]
#[Assert\Count(min: 1)]
private array $workDaysInput;
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload)
{
$workDays = $this->getWorkDaysInput();
$allowedDays = [
"full-week",
"partial-week-3-4",
"partial-week-1-2",
"night-and-weekend"
];
$violations = [];
forEach($workDays as $day) {
if (in_array($day, $allowedDays, true)) {
continue;
}
$violations[] =
$context->buildViolation(sprintf('Day selection %s not allowed', $day))
->atPath('workDays')
->addViolation()
;
}
if (count($violations) > 0) {
return $violations;
}
}
Это зависит от контекста и от того, где используется массив. Но вы можете использовать компонент проверки. Подробнее см. https://symfony.com/doc/current/validation.html
Вот быстрый простой пример, если вы используете сущность. если вам нужно выполнить эту проверку во многих местах, я рекомендую создать собственное ограничение проверки. подробности см. здесь https://symfony.com/doc/current/validation/custom_constraint.html
В этом примере мы будем использовать ограничение обратного вызова, см. https://symfony.com/doc/current/reference/constraints/Callback.html.
Добавьте следующее в ваш файл php. Когда этот класс проходит через валидатор, он читает аннотацию и запускает функцию проверки. Использование обратного вызова проверки. Вам нужно будет проверить каждое свойство по отдельности и установить ошибку для каждого ограничения, в этом примере мы проверяем workDaysInput
.
Вам нужно будет включить следующие операторы использования в начало вашего класса.
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload){
$workDays = $this->getWorkDaysInput();
$allowedDays = [
"full-week",
"partial-week-3-4",
"partial-week-1-2",
"night-and-weekend"
];
if (count($workDays) < 1 && count($workDays) > 4) {
return $context->buildViolation('Incorrect amount of options selected')
->atPath('workDays')
->addViolation();
}
forEach($workDays as $day){
if (in_array($day, $allowedDays)) return $context->buildViolation(sprintf('Day selection %s not allowed', $day))
->atPath('workDays')
->addViolation();
}
}
Это может помочь при создании пользовательской проверки вашего массива. «Проверка массивов возможна с использованием ограничения Collection» здесь из документации.