diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 2a4dd20..a60834a 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -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 }}) diff --git a/composer.json b/composer.json index 85ef533..7a6eaf0 100644 --- a/composer.json +++ b/composer.json @@ -3,9 +3,11 @@ "description": "Content validation for PSR-15 middleware", "keywords": [ "validation", + "content-validation", "middleware", - "laminas", "mezzio", + "slim", + "json-schema", "psr15" ], "require": { diff --git a/src/Factory/ValidatorFactory.php b/src/Factory/ValidatorFactory.php index 9cadb0e..ee5e079 100644 --- a/src/Factory/ValidatorFactory.php +++ b/src/Factory/ValidatorFactory.php @@ -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( diff --git a/test/Factory/ValidatorFactoryTest.php b/test/Factory/ValidatorFactoryTest.php index bce097f..b64da1c 100644 --- a/test/Factory/ValidatorFactoryTest.php +++ b/test/Factory/ValidatorFactoryTest.php @@ -18,7 +18,7 @@ public function testFactory(): void $data = <<<'JSON' { "name": "John Doe", - "age": "18", + "age": "18abcd", "unchecked": "sdf", "state": "0", "sub" : { diff --git a/test/SetupTrait.php b/test/SetupTrait.php index b952780..ea16cd5 100644 --- a/test/SetupTrait.php +++ b/test/SetupTrait.php @@ -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; @@ -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; } }