zfcampus / zf-content-validation
Requires
- php: ^5.6 || ^7.0
- zendframework/zend-eventmanager: ^2.6.3 || ^3.0.1
- zendframework/zend-filter: ^2.7.1
- zendframework/zend-http: ^2.5.4
- zendframework/zend-inputfilter: ^2.8
- zendframework/zend-mvc: ^2.7.15 || ^3.0.4
- zendframework/zend-servicemanager: ^2.7.6 || ^3.1
- zendframework/zend-stdlib: ^3.2.1
- zendframework/zend-validator: ^2.8.1
- zfcampus/zf-api-problem: ^1.2.1
- zfcampus/zf-content-negotiation: ^1.2.1
Requires (Dev)
- phpunit/phpunit: ^5.7.27 || ^6.5.8 || ^7.1.5
- zendframework/zend-coding-standard: ~1.0.0
- zendframework/zend-db: ^2.8.1
- dev-master / 1.8.x-dev
- dev-develop / 1.9.x-dev
- 1.8.0
- 1.7.1
- 1.7.0
- 1.6.1
- 1.6.0
- 1.5.0
- 1.4.0
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.0
- 1.1.1
- 1.1.0
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 1.0.0-beta3
- 1.0.0beta2
- 1.0.0beta1
- 0.9.1
- 0.9.0
- 0.8.0
- dev-feature/readme-documentation
- dev-hotfix/use-input-filter-manager-as-fallback
This package is auto-updated.
Last update: 2020-01-20 17:16:22 UTC
README
仓库已废弃于2019-12-31
简介
自动化验证传入输入的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-validation
和input_filter_specs
(命名方式以便将来将此功能移入ZF2)。
服务名称键
zf-content-validation
键是控制器服务名称与值的映射,值是一个数组,确定响应哪个HTTP方法以及将哪个输入过滤器映射到给定的请求。映射的键可以是接受请求体的HTTP方法(例如,POST
、PUT
、PATCH
或DELETE
),或者可以是单词input_filter
。分配给input_filter
键的值将在没有为当前HTTP请求方法配置输入过滤器时使用。
具有默认值和POST过滤器的示例
'zf-content-validation' => [ 'Application\Controller\HelloWorld' => [ 'input_filter' => 'Application\Controller\HelloWorld\Validator', 'POST' => 'Application\Controller\HelloWorld\CreationValidator', ], ],
在上面的示例中,对于PATCH
、PUT
或DELETE
请求,将选择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
。