Validator with Zend\I18n\Validator\DateTime is always required
alexisbmills opened this issue · 2 comments
I am attempting to use the DateTime validator in an Apigility project. The configuration is set to not be required and continue if empty, however the validator always returns a validation error.
Input
{"name": "Joe Public", "email": "joe@business.com"}
Validator configuration
1 => array(
'name' => 'dateField',
'required' => false,
'filters' => array(),
'validators' => array(
0 => array(
'name' => 'Zend\\I18n\\Validator\\DateTime',
'options' => array(
'pattern' => 'Y-m-d\TH:iP',
'message' => 'Date format must be Y-m-d\TH:iP',
),
),
),
'allow_empty' => true,
'continue_if_empty' => true,
'description' => 'Date field',
),
Error message
{
"validation_messages": {
"dateOfBirth": {
"datetimeInvalid": "Date format must be Y-m-d\TH:iP"
}
},
"type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
"title": "Unprocessable Entity",
"status": 422,
"detail": "Failed Validation"
}
I cannot reproduce.
To attempt to reproduce, I added zend-i18n as a dev dependency (composer require --dev zendframework/zend-i18n
), and then edited test/ContentValidationListenerTest.php
to do the following:
- Import
Zend\I18n\Validator\DateTime
- Add the following test case:
public function testUnrequiredDateTimeValidatorShouldNotResultInInvalidationOfSet()
{
$services = new ServiceManager();
$factory = new InputFilterFactory();
$services->setService('FooValidator', $factory->createInputFilter([
'dateField' => [
'name' => 'dateField',
'required' => false,
'validators' => [
[
'name' => DateTime::class,
'options' => [
'pattern' => 'Y-m-d\TH:iP',
'message' => 'Invalid date format',
],
],
],
'allow_empty' => true,
'continue_if_empty' => true,
'description' => 'Date Field',
],
]));
$listener = new ContentValidationListener(
[
'Foo' => [
'GET' => 'FooValidator',
],
],
$services,
['Foo' => 'foo_id']
);
$request = new HttpRequest();
$request->setMethod('POST');
$matches = $this->createRouteMatch(['controller' => 'Foo', 'foo_id' => 3]);
$dataParams = new ParameterDataContainer();
$dataParams->setBodyParams([
'name' => 'Joe Public',
'email' => 'joe@business.com',
]);
$event = new MvcEvent();
$event->setRequest($request);
$event->setRouteMatch($matches);
$event->setParam('ZFContentNegotiationParameterData', $dataParams);
$this->assertNull($listener->onRoute($event));
$this->assertNull($event->getResponse());
}
null
is expected when validation passes; otherwise, it will return an ApiProblem.
The test passed.
Can you update your dependencies and report back if the problem still exists? If it does, we'll need more information.
This repository has been closed and moved to laminas-api-tools/api-tools-content-validation; a new issue has been opened at laminas-api-tools/api-tools-content-validation#7.