davajlama / schemator
Schemator is lightweight library for data validation, sanitization and API documentation generation.
Installs: 2 058
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ~8.0
- ext-json: *
- ext-mbstring: *
- symfony/yaml: ^6.0|^7.0
Requires (Dev)
- phpstan/phpstan: ^1.4
- phpstan/phpstan-phpunit: ^1.0
- phpstan/phpstan-strict-rules: ^1.1
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ^7.2
This package is auto-updated.
Last update: 2024-05-18 08:31:43 UTC
README
Schemator is lightweight library for data validation, sanitization and API documentation generation.
- Data validation
- Data sanitization
- JSON Schema builder
- OpenApi builder
- Swagger builder
Data validation
Define schema:
$schema = new Schema(); $schema->prop('firstname')->string()->minLength(1)->maxLength(100)->required(); $schema->prop('surname')->string()->minLength(1)->maxLength(100)->required(); $schema->prop('sex')->enum(['MALE', 'FEMALE'])->required(); // OR #[RequiredAll] class Author { public function __construct( #[RangeLength(1, 100)] public string $firstname, #[RangeLength(1, 100)] public string $surname, #[Enum(['MALE', 'FEMALE'])] public string $sex, ) { } }
Data validation:
$payload = [ 'firstname' => 'Dave', 'surname' => 'Lister', 'sex' => 'MALE', ]; try { (new ArrayValidator())->validate($schema, $payload); // OR (new ArrayValidator())->validate((new SchemaBuilder())->build(Author::class), $payload); } catch (ValidationFailedException $e) { var_dump(MessageFormatter::toFlatten($e->getErrors())); }
Conditional validation:
$payload = [ 'firstname' => 'Dave', 'surname' => 'Lister', ]; $conditions = new ArraySchemaConditions(); $conditions->props('firstname', 'surname')->filledAllOrNone(); try { $conditions->validate($payload); } catch (ValidationFailedException $e) { var_dump(MessageFormatter::toFlatten($e->getErrors())); }
Data sanitization
$payload = [ 'firstname' => ' Dave ', 'surname' => 'Lister ', ]; $sanitizer = new ArrayDataSanitizer(); $sanitizer->props('firstname', 'surname')->trim(); $sanitizer->props('sex')->defaultIfNotExists('MALE'); $sanitizedPayload = $sanitizer->sanitize($payload);
JSON Schema builder
$builder = new JsonSchemaBuilder(); $builder->buildToJson($schema); // return JSON Schema specification
OpenApi builder
$api = new Api(); $api->info()->title('Example documentation'); $api->info()->description((string) file_get_contents(__DIR__ . '/description.md')); $api->info()->version('1.0.0'); Partition::apply($api, Partition::create(static function (Api $api): void { $ep = $api->get('/book-store/manage/attribute/list'); $ep->tags('BookStore', 'BookStore - Manage'); $ep->headerParam('x-api-key', true)->description('User api key'); $ep->queryParam('limit'); $ep->queryParam('offset'); $ep->jsonResponse200Ok(Attributes::class); $ep->jsonResponse401AuthorizationRequired(Problem::class); $ep->response500InternalServerError(); })); $builder = new OpenApiBuilder(new JsonSchemaBuilder()); $generator->build($api); // return OpenApi specification
Swagger builder
$swagger = new SwaggerBuilder(); echo $swagger->build($api, 'Bookstore API'); // return HTML Swagger documentation