seblegall/api-validator-bundle

v0.1.0 2016-06-16 18:27 UTC

This package is not auto-updated.

Last update: 2024-09-20 22:31:22 UTC


README

GitHub license Build Status Code Coverage Scrutinizer Code Quality

基于 Symfony 的参数袋的数据验证包。

要求

  • PHP > 5.3
  • Symfony > 2.4
  • Composer

工作原理

REST 很好。但大多数时候,很难以无状态的方式思考你的 Web 服务架构。以下是一个例子。

如果你需要设计一个个人数据表单,并希望用户填写一些字段,如 namefirstnamebirthdate 以及两个地址,每个地址都有一个 address、一个 city、一个 zipcode 和一个 country

在这种情况下,你的数据库模型可能看起来像这样

现在,如果你想要严格使用 REST 标准,你可能会公开 2 个 WS

  • 一个是 POST 用户
  • 另一个是 POST 地址

然后,为每个对象,使用 Validator Symfony 组件来填充对象、检查一些规则,例如名称只能由字母组成。以下是一个示例

$user = new User();
$user->setName($request->get('name'))

$errors = $this->validator->validate($user);
if($errors) {
  //...
}

然而,大多数情况下,你可能不会这样做。有一些原因

  • 如果希望提高性能,至少需要 3 次调用来提交一个简单的表单可能是个糟糕的想法
  • 这样,将很难检查,例如,两个必需的地址是否不同。(你可能需要先提交第一个地址,然后检查数据库以与第二个地址进行比较)
  • 一些 WS 可能是无状态的,但在领域上没有任何意义。

避免此类问题的一个常见方法是使用 API 中的 Symfony Form Builder。然后,您需要使用请求数据填充表单,并使用 Symfony 验证器方法 isValid() 在表单上测试。

这不是处理 REST 数据验证的好方法。

  • 首先,Symfony 表单设计是用来实际生成 HTML 表单的。
  • 为什么要在前端应用程序已经有一个表单的情况下创建一个表单对象(使用工厂)呢?
  • 当需要实际显示(HTML 方式)错误时,表单验证很好。如果你的目标是向前端应用程序发送错误消息……嗯……那不是目的。

这个包正是你需要的解决方案。

与公开 2 个 WS 不同,你将只公开一个。你将能够发送所有数据作为 Json 对象,并验证 Json 对象而不是分别验证每个领域对象。

以下是你将能够做到的示例

发送你的数据

{
   "name":"Doe",
   "firstname":"John",
   "birthdate":"11/24/1988",
   "addresses":[
      {
         "address":"36, Disney Road",
         "city":"Paradize",
         "zipcode":"764576",
         "country":"France"
      },
      {
         "address":"37, Mickey Road",
         "city":"Paradize",
         "zipcode":"764576",
         "country":"France"
      }
   ]
}

然后,该包将使用 Symfony 验证器组件为您验证所有对象。你所需要做的只是创建一个 ParameterBag 类,在其中定义所有预期的参数(查询、POST、GET 等),并创建一个相关的验证器文件,在其中定义你需要的所有规则。

例如,你可以在地址上应用一些唯一约束。

安装

使用 Composer

$ composer require seblegall/api-validator-bundle

然后,在您的 Symfony 的 AppKernel.php 文件中设置此包

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        return array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            // ...
            new Seblegall\ApiValidatorBundle\ApiValidatorBundle(),
        );
    }
// ....

最后,通过在 app/config/routing.yml 文件中插入以下行来导入包路由

api_validator_bundle:
    resource: "@ApiValidatorBundle/Resources/config/routing.yml"

用法

请参阅文档

许可证

ApiValidatorBundle遵循MIT许可证 - 请参阅LICENSE文件以获取详细信息