zfcampus/zf-content-validation

此包已被废弃,不再维护。作者建议使用laminas-api-tools/api-tools-content-validation包。

提供输入内容验证的Zend Framework模块


README

仓库已废弃于2019-12-31

此仓库已迁移至 laminas-api-tools/api-tools-content-validation

Build Status Coverage Status

简介

自动化验证传入输入的Zend Framework模块。

允许以下操作

  • 定义命名输入过滤器。
  • 将命名输入过滤器映射到命名控制器服务。
  • 在无效输入上返回带有验证错误消息的ApiProblemResponse

要求

请参阅composer.json文件。

安装

运行以下composer命令

$ composer require zfcampus/zf-content-validation

或者,手动将以下内容添加到您的composer.json文件中的require部分

"require": {
    "zfcampus/zf-content-validation": "^1.4"
}

然后运行composer update以确保安装模块。

最后,将模块名称添加到项目配置文件config/application.config.php中的modules键下

return [
    /* ... */
    'modules' => [
        /* ... */
        'ZF\ContentValidation',
    ],
    /* ... */
];

配置

用户配置

此模块利用两个用户级别配置键zf-content-validationinput_filter_specs(命名方式以便将来将此功能移入ZF2)。

服务名称键

zf-content-validation键是控制器服务名称与值的映射,值是一个数组,确定响应哪个HTTP方法以及将哪个输入过滤器映射到给定的请求。映射的键可以是接受请求体的HTTP方法(例如,POSTPUTPATCHDELETE),或者可以是单词input_filter。分配给input_filter键的值将在没有为当前HTTP请求方法配置输入过滤器时使用。

具有默认值和POST过滤器的示例

'zf-content-validation' => [
    'Application\Controller\HelloWorld' => [
        'input_filter' => 'Application\Controller\HelloWorld\Validator',
        'POST' => 'Application\Controller\HelloWorld\CreationValidator',
    ],
],

在上面的示例中,对于PATCHPUTDELETE请求,将选择Application\Controller\HelloWorld\Validator服务,而对于POST请求,将选择Application\Controller\HelloWorld\CreationValidator

从版本1.1.0开始,可以定义两个额外的键来影响应用程序验证行为

  • use_raw_data:如果不存在,则始终将原始数据注入到由zf-content-negotiation定义的“BodyParams”容器中。如果此键存在且为布尔值false,则将使用来自输入过滤器的验证和过滤后的数据。

  • allows_only_fields_in_filter:如果存在,且use_raw_data为布尔值false,则此标志的值将定义是否将负载中存在的其他字段与过滤后的数据合并。

  • remove_empty_data:是否应从接收到的数据中删除空数据?

    • 如果没有remove_empty_data标志,则不进行任何操作 - 按原样使用数据
    • 如果存在remove_empty_data标志且为布尔值true,则从当前数据数组中删除空数据
    • 如果键匹配接收到的数据,则不会删除空数据

验证GET请求

  • 自1.3.0版本起。

从1.3.0版本开始,您还可以指定GET作为HTTP方法,将其映射到输入过滤器以验证查询参数。配置方法与上面部分描述的完全相同。

此功能仅在手动配置您的API时可用;它不会在管理UI中公开。

验证集合请求

  • 自1.5.0版本起

从1.5.0版本开始,您可以指定以下任何一个作为键:

  • POST_COLLECTION
  • PUT_COLLECTION
  • PATCH_COLLECTION

这些键将专门与给定的HTTP方法一起使用,但仅限于匹配集合端点的请求。

验证DELETE请求

  • 自1.6.0版本起

从1.6.0版本开始,您可以指定以下每个键用于输入过滤器:

  • DELETE
  • DELETE_COLLECTION

与键关联的输入过滤器将用于验证请求体中发送的数据。

input_filter_spec

input_filter_spec用于配置驱动的输入过滤器创建。此数组的关键字将是唯一的名称,但更常见的是根据映射到zf-content-validation键下的服务名称。值将是输入过滤器配置数组,正如在ZF2手册输入过滤器部分中所描述的那样。

示例

'input_filter_specs' => [
    'Application\Controller\HelloWorldGet' => [
        0 => [
            'name' => 'name',
            'required' => true,
            'filters' => [
                0 => [
                    'name' => 'Zend\Filter\StringTrim',
                    'options' => [],
                ],
            ],
            'validators' => [],
            'description' => 'Hello to name',
            'allow_empty' => false,
            'continue_if_empty' => false,
        ],
    ],

系统配置

以下配置由模块定义,以便在ZF2应用程序中运行。

namespace ZF\ContentValidation;

use Zend\InputFiler\InputFilterAbstractServiceFactory;
use Zend\ServiceManager\Factory\InvokableFactory;

return [
    'controller_plugins' => [
        'aliases' => [
            'getinputfilter' => InputFilter\InputFilterPlugin::class,
            'getInputfilter' => InputFilter\InputFilterPlugin::class,
            'getInputFilter' => InputFilter\InputFilterPlugin::class,
        ],
        'factories' => [
            InputFilter\InputFilterPlugin::class => InvokableFactory::class,
        ],
    ],
    'input_filters' => [
        'abstract_factories' => [
            InputFilterAbstractServiceFactory::class,
        ],
    ],
    'service_manager' => [
        'factories' => [
            ContentValidationListener::class => ContentValidationListenerFactory::class,
        ],
    ],
    'validators' => [
        'factories' => [
            'ZF\ContentValidation\Validator\DbRecordExists' => Validator\Db\RecordExistsFactory::class,
            'ZF\ContentValidation\Validator\DbNoRecordExists' => Validator\Db\NoRecordExistsFactory::class,
        ],
    ],
];

ZF事件

监听器

ZF\ContentValidation\ContentValidationListener

此监听器连接到MvcEvent::EVENT_ROUTE事件,优先级为-650。其目的是利用zf-content-validation配置来确定当前请求所选控制器服务名称是否有配置的输入过滤器。如果有,它将遍历配置文件中的映射以创建适当的输入过滤器(来自配置或Zend Framework 2输入过滤器插件管理器),以验证传入的数据。此特定监听器使用zf-content-negotiation数据容器中的数据以获取反序列化的内容主体参数。

事件

ZF\ContentValidation\ContentValidationListener::EVENT_BEFORE_VALIDATE

此事件由ZF\ContentValidation\ContentValidationListener::onRoute()(如上所述)在聚合要验证的数据和确定输入过滤器之间以及实际验证数据时发出。

  • 其目的是允许用户
  • 修改要验证的数据集(自1.4.0版本起可用)。

例如,您可能想验证通过URI提供的标识符,并在路由过程中进行匹配。您可以按照以下方式操作

$events->listen(ContentValidationListener::EVENT_BEFORE_VALIDATE, function ($e) {
    if ($e->getController() !== MyRestController::class) {
        return;
    }

    $matches = $e->getRouteMatch();
    $data = $e->getParam('ZF\ContentValidation\ParameterData') ?: [];
    $data['id'] = $matches->getParam('id');
    $e->setParam('ZF\ContentValidation\ParameterData', $data);
});

ZF 服务

控制器插件

ZF\ContentValidation\InputFilter\InputFilterPlugin(即 getInputFilter)

此插件适用于 Zend Framework 2 控制器。当调用($this->getInputFilter()$this->plugin('getinputfilter')->__invoke())时,它返回 MVC 事件参数 ZF\ContentValidation\InputFilter 中的内容,对于任何不是 Zend\InputFilter\InputFilter 实现的值,返回 null。

服务

Zend\InputFilter\InputFilterAbstractServiceFactory

该抽象工厂负责根据名称和从顶级键 input_filter_specs 的配置创建并返回适当的输入过滤器。它已注册到 Zend\InputFilter\InputFilterPluginManager