glaphire
@glaphire
PHP developer

Как правильно валидировать сырые параметры запроса в Symfony?

Использую Symfony 5.0.

Понимаю, что ухожу сильно не туда в попытке задать валидацию для опционального GET параметра.
Нужно валидировать, что параметр param может иметь только true|false значение.
Сейчас у меня взаимоисключающие параграфы в коде - получение GET параметра и приведение его в тип bool нивелирует валидацию, а сырой GET-параметр имеет тип string, а не bool и поэтому валидация не работает как предполагалось.

Наверняка есть более чистый способ, но поиски не дают результата. Подскажите подход или ссылку на пример, пожалуйста.

Запрос: GET /neo/fastest?hazardous=true
Код:
/**
     * @Route("/neo/fastest", name="neo_fastest", methods={"GET"})
     */
    public function getFastestNearEarthObject(Request $request)
    {
        $constraints = new Collection([
            'hazardous' => [new Optional(new Type(['type' => 'boolean']))],
        ]);

        $errors = $this->validate($request->get('hazardous', false), $constraints);

        if ($errors) {
            return $this->json($errors, 400);
        }

        $isHazardous = filter_var($request->get('hazardous', false), FILTER_VALIDATE_BOOLEAN);
        //other code
   }

    /**
     * @param $value
     * @param $constraints
     *
     * @return array|void
     */
    protected function validate($value, $constraints)
    {
        $validator = Validation::createValidator();
        $violations = $validator->validate($value, $constraints);
        $messages = [];

        if (0 === count($violations)) {
            return;
        }

        foreach ($violations as $violation) {
            /* @var ConstraintViolation $violation */
            $messages[] = $violation->getMessage();
        }

        return $messages;
    }
  • Вопрос задан
  • 719 просмотров
Пригласить эксперта
Ответы на вопрос 1
andrew72ru
@andrew72ru
системный администратор, веб-разработчик
$isHazardous = $request->query->getBoolean('hazardous');


Будет true если передано "true" или 1, и false если "false" или 0.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы