Валидация для Rest Api в Symfony 4 - PullRequest
0 голосов
/ 18 февраля 2019

Я собираюсь написать REST API для моего проекта.Я использую Symfony 4. Я видел несколько примеров, но ни один из них мне не подходит.

  1. Проверка с помощью объекта Form.Это не работает для меня, потому что это API, там нет форм.Я не хочу писать фиктивные классы только для поддержки этой функциональности.
  2. На этой странице https://symfony.com/doc/current/validation.html они предлагают 4 способа: аннотации, yml, xml, php.Это решение мне не подходит, потому что эта валидация связана с сущностью, API - гораздо шире в режиме: в ней есть лимит, смещение, фильтры и другие поля, которые не принадлежат сущности.

Итак, я думаю, что мне нужно написать валидатор, который имеет массив ограничений для всех возможных полей.Я просто не знаю, как это лучше всего представить.Вы когда-нибудь видели что-то подобное?

PS Перед написанием этого поста я использовал поиск по stackoverflow.Я не нашел полезных ответов.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Я думаю, что использовать формы, как обычно, очень чисто и приятно.https://codereviewvideos.com/course/beginners-guide-back-end-json-api-front-end-2018/video/validating-json-data-symfony

Я выбираю этот API, потому что он был самым быстрым в моих тестах.Вам не нужно покупать курс (но вы можете, если вам нравится код), просто следуйте статьям «Сырой Symfony 4» в этой серии (вам также не нужна часть «Беат»)

«Лимит»,Функциональность «смещение» и «фильтр» принадлежит вашим репозиториям.Так же, как вы передаете здесь идентификатор в хранилище

/**
 * Class AlbumController
 * @package App\Controller
 */
class AlbumController extends AbstractController
{
    // ....

    /**
     * @Route(
     *     path         = "/api/album/{id}",
     *     name         = "get_album",
     *     methods      = {"GET"},
     *     requirements = {"id"="\d+"}
     * )
     * @param int $id
     *
     * @return JsonResponse
     */
    public function get($id)
    {
        return new JsonResponse($this->findAlbumById($id), JsonResponse::HTTP_OK);
    }  

    /**
     * @param $id
     *
     * @return Album|null
     * @throws NotFoundHttpException
     */
    private function findAlbumById($id)
    {
        $album = $this->albumRepository->find($id);

        if ($album === null) {
            throw new NotFoundHttpException();
        }

        return $album;
    }
0 голосов
/ 18 февраля 2019

Глядя на ваш пример (example.com/api/categories?limit=20&offset=300&filter=something), я думаю, ваше действие будет выглядеть примерно так:

public function getCategories(?int $limit, ?int $offset, ?string $filter)
{
    //...
}

Проверка коллекции

Вы можете определить свои ограничения в виде массива (и позжеабстрагируйте его в свой собственный класс) и передайте в качестве второго аргумента вашему валидатору.

$constraint = new Assert\Collection([
    'limit' => [
        new Assert\Range(['min' => 0, 'max' => 999]),
        new Assert\DivisibleBy(0.5)
    ],
    'offset' => new Assert\Range(['min' => 0, 'max' => 999]),
    'filter' => new Assert\Regex("/^\w+/")
]);

$validationResult = $this->validator->validate(
    ['limit' => $limit, 'offset' => $offset, 'filter' => $filter],
    $constraint
);

Документация ссылка .

Проверка по одному

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

$offsetValidationResult = $this->validator->validate(
    $offset,
    new Assert\Range(['min' => 0, 'max' => 999])
);
//...

Документация ссылка .

Проверка объекта

Создайте класс с тремя полями в нем.

class FilterParameters
{
    public function __construct($limit, $offset, $filter)
    {
        $this->limit = $limit;
        $this->offset = $offset;
        $this->filter = $filter;
    }

    // No getters/setters for brevity
    /**
     * @Assert\DivisibleBy(0.25)
     */
    public $limit;
    /**
     * @Assert\Range(min = 0, max = 999)
     */
    public $offset;
    /**
     * @Assert\Regex("/^\w+/")
     */
    public $filter;
}

Создайте и подтвердите его.

$validationResult = $this->validator->validate(
    new FilterParameters($limit, $offset, $filter)
);

Документация ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...