gpt4 book ai didi

rest - 在 Symfony 4 中验证 Rest Api

转载 作者:行者123 更新时间:2023-12-01 23:27:23 27 4
gpt4 key购买 nike

我将为我的项目编写 REST API。我正在使用 symfony 4。我看到了几个例子,但没有一个适合我。

  • 使用 Form 对象进行验证。它对我不起作用,因为它是 API,没有表格。我不想编写虚拟类只是为了支持这个功能。
  • 在本页 https://symfony.com/doc/current/validation.html他们建议了 4 种方式:注释、yml、xml、php。此解决方案不适合我,因为此验证与实体 API 相关 - 模式范围更广:它具有限制、偏移、过滤器和其他不属于实体的字段。

  • 所以,我想我需要编写验证器,它对所有可能的字段都有一组约束。我只是不知道什么是最好的呈现方式。你见过类似的东西吗?

    附言在写这篇文章之前,我使用了 stackoverflow 搜索。我没有找到有用的答案。

    最佳答案

    看看你的例子( example.com/api/categories?limit=20&offset=300&filter=something )我猜你的 Action 看起来像这样:

    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
    );

    文档 link .

    一一验证

    对于要验证的每个参数,将约束作为第二个参数传递给验证器。

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

    文档 link .

    对象验证

    创建一个包含 3 个字段的类。

    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)
    );

    文档 link .

    关于rest - 在 Symfony 4 中验证 Rest Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737796/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com