Nette Documentation Preview

syntax
Export do JSON Schema
*********************

<div class=perex>

Vaše schéma už je přesným popisem toho, co smí konfigurace obsahovat, a ten popis se hodí i mimo PHP. Vyexportované do JSON Schema umožní editorům:

- nabízet doplňování klíčů a hodnot přímo v konfiguračním souboru
- podtrhnout chyby dřív, než se aplikace vůbec spustí
- ukazovat popisy voleb jako nápovědu

</div>


Export .{data-version:1.4.0}
============================

Metoda `JsonSchema::export()` vytvoří z vašeho schématu dokument "JSON Schema":https://json-schema.org, tedy formát, který čtou editory, aby rovnou v JSON nebo YAML souboru nabízely doplňování a podtrhávaly chyby:

```php
use Nette\Schema\Expect;
use Nette\Schema\JsonSchema;

$schema = Expect::structure([
	'host' => Expect::string('localhost')->description('Database server hostname'),
	'port' => Expect::int(3306)->min(1)->max(65535),
	'user' => Expect::string()->required(),
]);

echo json_encode(JsonSchema::export($schema), JSON_PRETTY_PRINT);
```

```json
{
	"type": "object",
	"properties": {
		"host": {"type": "string", "description": "Database server hostname"},
		"port": {"type": "integer", "minimum": 1, "maximum": 65535},
		"user": {"type": "string"}
	},
	"required": ["user"],
	"additionalProperties": false
}
```

Výsledek uložte do souboru a nasměrujte na něj svůj editor; jak přesně, záleží na editoru a na formátu konfiguračního souboru.


Co export obsahuje
==================

Export popisuje **tvar** dat: typy, rozsahy, regulární výrazy, povinné položky, hodnoty výčtů a texty, které jste přidali metodou [description() |types#Popis: description()].

Výchozí hodnoty, `castTo()` a `transform()` v něm záměrně nejsou, protože popisují, co se s daty děje až po validaci, a to JSON Schema vyjádřit neumí.

Typ, který existuje jen v PHP, třeba třídu (`Expect::type(Address::class)`), callable nebo resource, exportovat vůbec nelze. Místo dokumentu, který by potichu popisoval něco jiného, export vyhodí `Nette\NotSupportedException`. Totéž platí pro [vlastní prvek |custom-elements], jehož pravidla export znát nemůže.


Rozdíly oproti validaci
=======================

Mezi exportem a validací zůstávají dva rozdíly. JSON Schema měří délku řetězce ve znacích, kdežto `Expect::string()` v bajtech, proto pro text, který není čisté ASCII, použijte `Expect::unicode()`. A `pattern()` se exportuje tak, jak je, ale validátor JSON Schema ho čte jako regulární výraz ECMAScriptu, takže konstrukce specifické pro PCRE tam mohou být pochopeny jinak.

{{maintitle: Nette Schema: export do JSON Schema pro doplňování v editoru}}
{{description: Vyexportujte Nette Schema do JSON Schema, aby editory nabízely doplňování a podtrhávaly chyby v konfiguračních souborech. Co export obsahuje a v čem se liší.}}

Export do JSON Schema

Vaše schéma už je přesným popisem toho, co smí konfigurace obsahovat, a ten popis se hodí i mimo PHP. Vyexportované do JSON Schema umožní editorům:

  • nabízet doplňování klíčů a hodnot přímo v konfiguračním souboru
  • podtrhnout chyby dřív, než se aplikace vůbec spustí
  • ukazovat popisy voleb jako nápovědu

Export

Metoda JsonSchema::export() vytvoří z vašeho schématu dokument JSON Schema, tedy formát, který čtou editory, aby rovnou v JSON nebo YAML souboru nabízely doplňování a podtrhávaly chyby:

use Nette\Schema\Expect;
use Nette\Schema\JsonSchema;

$schema = Expect::structure([
	'host' => Expect::string('localhost')->description('Database server hostname'),
	'port' => Expect::int(3306)->min(1)->max(65535),
	'user' => Expect::string()->required(),
]);

echo json_encode(JsonSchema::export($schema), JSON_PRETTY_PRINT);
{
	"type": "object",
	"properties": {
		"host": {"type": "string", "description": "Database server hostname"},
		"port": {"type": "integer", "minimum": 1, "maximum": 65535},
		"user": {"type": "string"}
	},
	"required": ["user"],
	"additionalProperties": false
}

Výsledek uložte do souboru a nasměrujte na něj svůj editor; jak přesně, záleží na editoru a na formátu konfiguračního souboru.

Co export obsahuje

Export popisuje tvar dat: typy, rozsahy, regulární výrazy, povinné položky, hodnoty výčtů a texty, které jste přidali metodou description().

Výchozí hodnoty, castTo() a transform() v něm záměrně nejsou, protože popisují, co se s daty děje až po validaci, a to JSON Schema vyjádřit neumí.

Typ, který existuje jen v PHP, třeba třídu (Expect::type(Address::class)), callable nebo resource, exportovat vůbec nelze. Místo dokumentu, který by potichu popisoval něco jiného, export vyhodí Nette\NotSupportedException. Totéž platí pro vlastní prvek, jehož pravidla export znát nemůže.

Rozdíly oproti validaci

Mezi exportem a validací zůstávají dva rozdíly. JSON Schema měří délku řetězce ve znacích, kdežto Expect::string() v bajtech, proto pro text, který není čisté ASCII, použijte Expect::unicode(). A pattern() se exportuje tak, jak je, ale validátor JSON Schema ho čte jako regulární výraz ECMAScriptu, takže konstrukce specifické pro PCRE tam mohou být pochopeny jinak.