Утвердить значения массива [Symfony] [Api-платформа]

Мне нужно проверить массив. И я также должен проверить значения в этом массиве.

Например, я хочу проверить каждую из этих записей и только эту. Если у меня есть что-нибудь еще, я хочу ошибку. Но я могу отправить только одну запись, если захочу. Как я могу это подтвердить?

"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;
    }
}

Это может помочь при создании пользовательской проверки вашего массива. «Проверка массивов возможна с использованием ограничения Collection» здесь из документации.

Bossman 18.11.2022 14:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это зависит от контекста и от того, где используется массив. Но вы можете использовать компонент проверки. Подробнее см. 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();
    }
}

Другие вопросы по теме