cucher/validata

验证自定义数据类(框架无关)

dev-master 2016-05-07 19:07 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:19:57 UTC


README

一个用于验证结构化数据与模式匹配的库。

状态

Build Status Coverage Status

这个库目前正在积极开发中,其API可能会发生变化。如果您想在生产环境中使用它,请几周后再次检查其状态...

为什么以及如何

大多数常见的网络应用程序处理 结构化 输入数据。例如:

  • 由HTML表单发送的数据
  • 用于AJAX请求的JSON或XML数据
  • 发送到服务器API的JSON或XML数据

在所有情况下,数据都需要进行验证。通常,这种验证与其他任务混合在一起,甚至可能与业务逻辑混合。这个库的目标是将验证步骤从业务逻辑中分离出来。

它是如何工作的?这个库提供

  • 定义验证模式和验证输入数据与该模式匹配的原语。
  • 表示结果和描述错误的类,包括它们的精确位置。

预期的用法是

  1. 为每个处理非平凡输入数据的控制器操作定义一个模式。这个模式定义了整个数据结构,以及每个单独值的其他特性。
  2. 输入数据与该模式进行验证。结果包含两部分
    • 有效的输入数据部分
    • 错误列表,每个错误都包含有关位置和确切错误类型的详细信息。这些信息可以用于向客户端报告错误。
  3. 控制器操作决定如何处理结果。通常,如果有任何错误,操作将发送包含错误信息的400 HTTP响应。如果没有错误,它可能调用一些业务模块来进一步处理数据。

依赖关系

对于“底层验证”,即验证单个标量值,使用 Respect Validation Library。没有依赖任何全栈框架。该库设计得易于集成到任何应用程序结构中。

用法

use Ckr\Validata\Schema;
use Ckr\Validata\Validator;
use Respect\Validation\Rules;

function action()
{
    $schema = getValidationSchema();
    $result = Validator::run($schema, $_POST);
    if ($result->hasErrors()) {
        handleErrors($result->getErrors());
    } else {
        handleRequest($result->getValidData());
    }
}

/**
 * Builds the validation schema for `action`
 */
function getValidationSchema()
{
    $mainSchema = new Schema\Map();
    $emailSchema = new Schema\Scalar(new Rules\Email());
    $usernameSchema = new Schema\Scalar(new Rules\Alnum());
    $mainSchema->property('email', $emailSchema);
    $mainSchema->property('username', $usernameSchema);

    return $mainSchema;
}

function handleErrors(array $errors)
{
    // TODO handle errors...
}

function handleRequest(array $validData)
{
    // TODO implement the actual business logic
}

虽然看起来代码很多,但其中很多都是相同的,可以抽象化。如何做到这一点,因框架或应用程序结构而异。

特别是错误处理可能可以用于所有相同API或应用程序的操作,因为错误具有详细的 信息,可以轻松地转换成JSON响应(或任何其他结构化数据格式)。

创建模式有点繁琐。我可能会在不久的将来提供构建器或类似的辅助工具,以使组合各种子模式更容易。