PHPackages                             systopia/opis-json-schema-ext - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. systopia/opis-json-schema-ext

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

systopia/opis-json-schema-ext
=============================

Extension for Opis JSON Schema

v0.6.4(6mo ago)018.5k↓40.6%[1 issues](https://github.com/systopia/opis-json-schema-ext/issues)Apache-2.0PHPPHP ^8.1

Since Oct 20Pushed 6mo ago4 watchersCompare

[ Source](https://github.com/systopia/opis-json-schema-ext)[ Packagist](https://packagist.org/packages/systopia/opis-json-schema-ext)[ Docs](https://github.com/systopia/opis-json-schema-ext)[ RSS](/packages/systopia-opis-json-schema-ext/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (3)Versions (16)Used By (0)

Systopia Opis JSON Schema Extension
===================================

[](#systopia-opis-json-schema-extension)

This is an extension for [Opis JSON Schema](https://opis.io/json-schema/).

Keywords
--------

[](#keywords)

The following additional keywords are provided:

- `$calculate`
- `evaluate`
- `maxDate`
- `minDate`
- `noIntersect` An array must not contain intersecting intervals.
- `$order` Order arrays. (Only performed, if array has no violations.)
- `precision`
- `$tag` Tagged data can be fetched from a data container after validation.
- `$validations`
- `$limitValidation` Allows to limit validation under specifiable conditions. See [below](#limit-validation).

See [tests](tests/) for how to use them.

The [`SystopiaValidator`](./src/SystopiaValidator.php) already provides those keywords. To use them in a different validator class you might want to use [`SystopiaSchemaParser`](./src/Parsers/SystopiaSchemaParser.php) or [`SystopiaVocabulary`](./src/Parsers/SystopiaVocabulary.php).

### Limit validation

[](#limit-validation)

The keyword `$limitValidation` allows to limit validation under specifiable conditions. The reason behind this keyword was to persist forms in an incomplete state. This can also be achieved with the `if-then-else` keywords, though it dramatically increases the size of the schema and is error-prone (at least for complex schemas).

The structure of the `$limitValidation` keyword is:

```
{
  "condition": JSON Schema,
  "rules": [
    {
      "keyword": JSON Schema,
      "keywordValue": JSON Schema,
      "value": JSON Schema,
      "calculatedValueUsedViolatedData": boolean|null,
      "validate": boolean
    }
  ],
  "schema": JSON Schema
}
```

`rules` can have an indefinite number of entries.

If the schema at `condition` is matched, limited validation is performed. It is applied on the keywords at the same depth and the keywords below. If it's not set, the result of the condition evaluation on a higher level is used. If the `$limitValidation` keyword is not used at a higher level, `false` is used as fallback.

The properties of a rule have the following defaults:

- `keyword`, `keywordValue`, `value`: `true`
- `calculatedValueUsedViolatedData`: `null`
- `validate`: `false`

To the entries in `rules` the [default rules](#default-rules) are always appended. To prevent the execution of the default rules a rule with just the `validate` property can be used (`{ "validate": false }` or `{ "validate": true }`).

`schema` has the default value `true`.

If the specified condition is matched, the rules are applied in case of a violation of a keyword at the same depth or of a keyword below. In case of a violation it will be iterated over the rules until a matching rule is found. If the `validate` property of that rule is false the violation will be ignored.

The rule matching is done like this:

- The violated keyword (e.g. `type`) is matched against the schema in `keyword`.
- The value of the violated keyword is matched against the schema in `keywordValue`.
- The invalid value is matched against the schema in `value`.

All schemas must be matched for a rule to be matched. If `calculatedValueUsedViolatedData` is not `null`, the value has to be calculated (with the `$calculate` keyword) and must or must not have used violated data depending on the actual value of `calculatedValueUsedViolatedData`. Violated data is used, if the calculation references a value that has a validation error (including ignored ones).

The keyword `schema` allows to specify a schema that is validated additionally, if the condition is matched. This allows for example to require some properties on limited validation: `"schema": { "required": ["foo", "bar"] }`.

Example:

```
{
  "$limitValidation": {
    "condition": {
      "properties": {
        "action": { "const": "save" }
      }
    },
    "rules": [
      {
        "keyword": { "const": "type" },
        "keywordValue": { "not": { "const": "string" } },
        "value": { "type": ["number", "bool"] },
        "validate": true
      },
      {
        "validate": false
      }
    ],
    "schema": {
      "required": ["example"]
    }
  }
}
```

This means that if the property `action` is set to `"save"`, limited validation is applied. The rules say that only violations are treated as such, if these conditions are met:

- The violated keyword is `type`.
- The value of the violated keyword is not `"string"`.
- The validated value is neither a number nor a boolean.

All other violations are ignored because of the second rule.

Additionally, the property `example` is required, if `action` is `"save"`.

#### Default rules

[](#default-rules)

The default rules are:

```
[
  {
    "value": { "const": null }
  },
  {
    "keyword": { "not": { "const": "type" } },
    "value": { "enum": [false, ""] }
  },
  {
    "keyword": {
      "enum": [
        "minLength",
        "minItems",
        "minContains",
        "minProperties",
        "required",
        "dependentRequired"
      ]
    }
  },
  {
    "calculatedValueUsedViolatedData": true
  },
  {
    "validate": true
  }
]
```

The rules mean:

1. No violation error, if the validated value is `null`.
2. No violation error, if the violated keyword is not `type` and the validated value is `false` or `""` (empty string).
3. No violation error, if the validated keyword is one of: `minLength`, `minItems`, `minContains`, `minProperties`, `required`, `dependentRequired`
4. No violation error, if value is calculated and calculation used data with violations (including ignored ones).
5. Every other validation without limitation.

Empty array to object conversion
--------------------------------

[](#empty-array-to-object-conversion)

If the option `convertEmptyArrays` is set to `true` (disabled by default), empty arrays will be converted to objects if the schema type contains `object`, but not `array`. This might be necessary if the data to validate was already decoded.

Translation
-----------

[](#translation)

This extension allows to translate `ValidationError`s:

First create an instance of `TranslatorInterface`:

```
$translator = new Translator($locale, $messages);
```

If there is a localisation in the `messages` directory you can use:

```
$translator = TranslatorFactory::createTranslator($locale);
```

Then create an instance of `ErrorTranslator`:

```
$errorTranslator = new ErrorTranslator($translator);
```

Let the `ErrorTranslator` translate a validation error:

```
echo $errorTranslator->trans($error);
```

###  Health Score

41

—

FairBetter than 89% of packages

Maintenance68

Regular maintenance activity

Popularity26

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~53 days

Total

15

Last Release

188d ago

PHP version history (3 changes)v0.1.0PHP ^7.4 || ^8

v0.6.0PHP ^8

v0.6.4PHP ^8.1

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5405481?v=4)[dontub](/maintainers/dontub)[@dontub](https://github.com/dontub)

![](https://www.gravatar.com/avatar/c47bde670f40823e7dfc00eb21125743d22a67525e9c0545258f1ed052f46537?d=identicon)[bjendres](/maintainers/bjendres)

---

Top Contributors

[![dontub](https://avatars.githubusercontent.com/u/5405481?v=4)](https://github.com/dontub "dontub (44 commits)")

---

Tags

json-schemaphpjsonschemavalidatorvalidationjson-schema

### Embed Badge

![Health badge](/badges/systopia-opis-json-schema-ext/health.svg)

```
[![Health](https://phpackages.com/badges/systopia-opis-json-schema-ext/health.svg)](https://phpackages.com/packages/systopia-opis-json-schema-ext)
```

###  Alternatives

[opis/json-schema

Json Schema Validator for PHP

64736.9M186](/packages/opis-json-schema)[geraintluff/jsv4

A (coercive) JSON Schema v4 Validator for PHP

115455.2k4](/packages/geraintluff-jsv4)[johnstevenson/json-works

Create, edit, query and validate json

272.5M6](/packages/johnstevenson-json-works)[evaisse/php-json-schema-generator

A JSON Schema Generator.

20298.5k1](/packages/evaisse-php-json-schema-generator)[dstotijn/yii2-json-schema-validator

A Yii2 extension that provides a validator class for JSON Schema validation.

1730.7k](/packages/dstotijn-yii2-json-schema-validator)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
