Skip to content

Commit

Permalink
Merge pull request #12 from zfegg/develop
Browse files Browse the repository at this point in the history
`ValidatorFactory` load configs.
  • Loading branch information
Moln committed Aug 4, 2021
2 parents 5bb39bb + efc8991 commit 87cee6f
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 13 deletions.
6 changes: 5 additions & 1 deletion .github/workflows/qa.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
name: qa
on: [push]
on:
push:
branches:
- master
pull_request:
jobs:
qa:
name: QA (PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }})
Expand Down
4 changes: 3 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
"description": "Content validation for PSR-15 middleware",
"keywords": [
"validation",
"content-validation",
"middleware",
"laminas",
"mezzio",
"slim",
"json-schema",
"psr15"
],
"require": {
Expand Down
36 changes: 32 additions & 4 deletions src/Factory/ValidatorFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,40 @@ class ValidatorFactory
{
public function __invoke(ContainerInterface $container): Validator
{
$config = $container->has('config') ? ($container->get('config')[Validator::class] ?? []) : [];

$validator = new Validator();
$parser = $validator->loader()->parser();
$parser->draft($parser->defaultDraftVersion())
->prependKeyword(new TypeCastParser())
->prependKeyword(new RemoveAdditionalPropertiesParser())
;

foreach ($parser->supportedDrafts() as $draft) {
$parser->draft($draft)
->prependKeyword(new TypeCastParser())
->prependKeyword(new RemoveAdditionalPropertiesParser());
}

if (isset($config['resolvers'])) {
foreach ($config['resolvers'] as $key => $resolvers) {
foreach ($resolvers as $resolver) {
$validator->resolver()->{'register' . ucfirst($key)}(...$resolver);
}
}
}

$filterResolver = $parser->getFilterResolver();
if (isset($config['filters'])) {
foreach ($config['filters'] as $name => $filter) {
$filter = is_string($filter) ? ['filter' => $container->get($filter)] : $filter;
$filter['filter'] = is_string($filter['filter'])
? $container->get($filter['filter'])
: $filter['filter'];
$filterResolver->registerMultipleTypes($name, $filter['filter'], $filter['types'] ?? null);
}
}
if (isset($config['filterNs'])) {
foreach ($config['filterNs'] as $ns => $resolver) {
$filterResolver->registerNS($ns, is_string($resolver) ? $container->get($resolver) : $resolver);
}
}

$types = ['string', 'integer', 'number'];
$parser->getFilterResolver()->registerMultipleTypes(
Expand Down
2 changes: 1 addition & 1 deletion test/Factory/ValidatorFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public function testFactory(): void
$data = <<<'JSON'
{
"name": "John Doe",
"age": "18",
"age": "18abcd",
"unchecked": "sdf",
"state": "0",
"sub" : {
Expand Down
26 changes: 20 additions & 6 deletions test/SetupTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace ZfeggTest\ContentValidation;

use Laminas\ServiceManager\ServiceManager;
use Opis\JsonSchema\Resolvers\FilterResolver;
use Opis\JsonSchema\Validator;
use Zfegg\ContentValidation\ConfigProvider;
use Zfegg\ContentValidation\ContentValidationMiddleware;
Expand All @@ -18,16 +19,29 @@ public function setUp(): void
{
$config = (new ConfigProvider())();
$container = new ServiceManager($config['dependencies']);
$container->setService('fooFilter', fn() => true);
$container->setService('barFilter', fn() => true);
$container->setService(
'config',
['zfegg' => [ContentValidationMiddleware::class => ['transform_object_to_array' => true]]]
new \ArrayObject([
'zfegg' => [ContentValidationMiddleware::class => ['transform_object_to_array' => true]],
Validator::class => [
'resolvers' => [
'prefix' => [
['test:test/', __DIR__]
],
],
'filters' => [
'fooFilter' => 'fooFilter',
'barFilter' => ['filter' => 'barFilter'],
],
'filterNs' => [
'fooNs' => new FilterResolver()
]
]
])
);

/** @var Validator $validator */
$validator = $container->get(Validator::class);
$validator->resolver()->registerPrefix('test:test/', __DIR__);
$middleware = $container->get(ContentValidationMiddleware::class);

$this->container = $container;
}
}

0 comments on commit 87cee6f

Please sign in to comment.