nur-ture/src/schema/README.md

184 lines
5.6 KiB
Markdown

# nulib\schema
les classes de ce package permettent de s'assurer que des données soit dans un
type particulier, en les convertissant si nécessaire. la source de ces données
peut-être diverse: formulaire web, résultat d'une requête SQL, flux CSV, etc.
les données dont on peut modéliser le schéma sont de 3 types: scalaire, tableau
associatif ou liste. la nature du schéma (la valeur de la clé `"""`) indique le
type de donnée modélisée
* donnée scalaire
forme courante:
~~~php
const SCALAR_SCHEMA = [
$type, [$default, $title, ...]
];
~~~
forme normalisée:
~~~php
const SCALAR_SCHEMA = [
$type, [$default, $title, ...]
"" => "scalar",
];
~~~
* tableau associatif
le tableau modélisé peut avoir des clés numériques ou chaines --> seules les
clés décrites par le schéma sont validées
forme courante:
~~~php
const ASSOC_SCHEMA = [
KEY => VALUE_SCHEMA,
...
];
~~~
forme normalisée:
~~~php
const ASSOC_SCHEMA = [
"?array", [$default, $title, ...]
"" => "assoc",
"schema" => [
KEY => VALUE_SCHEMA,
...
],
];
~~~
* liste (tableau d'éléments du même type)
le tableau modélisé peut avoir des clés numériques ou chaines --> on ne
modélise ni le type ni la valeur des clés
forme courante:
~~~php
const LIST_SCHEMA = [[
ITEM_SCHEMA,
]];
~~~
forme normalisée:
~~~php
const LIST_SCHEMA = [
"?array", [$default, $title, ...]
"" => "list",
"schema" => ITEM_SCHEMA,
];
~~~
## Schéma d'une valeur scalaire
Dans sa forme normalisée, une valeur scalaire est généralement modélisée de
cette manière:
~~~php
const SCALAR_SCHEMA = [
"type" => "types autorisés de la valeur",
"default" => "valeur par défaut si la valeur n'existe pas",
"title" => "libellé de la valeur, utilisable par exemple dans un formulaire",
"required" => "la valeur est-elle requise? si oui, elle doit exister",
"nullable" => "si la valeur existe, peut-elle être nulle?",
"desc" => "description de la valeur",
"analyzer_func" => "XXX",
"extractor_func" => "XXX",
"parser_func" => "une fonction qui analyse une chaine pour produire la valeur",
"messages" => "messages à afficher en cas d'erreur d'analyse",
"formatter_func" => "une fonction qui formatte la valeur pour affichage",
"format" => "format à utiliser pour l'affichage",
"" => "scalar",
"schema" => "schéma de la valeur si le type est array ou ?array, null sinon",
];
~~~
L'ordre des clés du schéma ci-dessus indique la clé associé à une valeur si elle
est fournie dans un tableau séquentiel. Par exemple, les deux schéma suivants
sont équivalents:
~~~php
const SCALAR_SCHEMA1 = [
"string", null, "une valeur chaine",
];
const SCALAR_SCHEMA2 = [
"type" => "string",
"default" => null,
"title" => "une valeur chaine",
"" => "scalar",
];
~~~
Si la nature du schéma n'est pas spécifiée, on considère que c'est un schéma de
nature scalaire si:
* c'est une chaine, qui représente alors le type, e.g `"string"`
* c'est un tableau avec un unique élément à l'index 0 de type chaine, qui est
aussi le type, e.g `["string"]`
* c'est un tableau avec un élément à l'index 0, ainsi que d'autres éléments,
e.g `["string", null, "required" => true]`
`messages` indique les messages à afficher en cas d'erreur d'analyse. les clés
sont normalisées et correspondent à différents états de la valeur tels
qu'analysés par `analyzer_func`
~~~php
const MESSAGE_SCHEMA = [
"missing" => "message si la valeur n'existe pas dans la source et qu'elle est requise",
"unavailable" => "message si la valeur vaut false dans la source et qu'elle est requise",
"null" => "message si la valeur est nulle et qu'elle n'est pas nullable",
"empty" => "message si la valeur est une chaine vide et que ce n'est pas autorisé",
"invalid" => "message si la valeur est invalide",
];
~~~
## Schéma d'un tableau associatif
Dans la forme courante, on considère que c'est un schéma de nature associative si:
* c'est un tableau uniquement associatif avec aucun élément séquentiel, e.g
`["name" => "string", "age" => "int"]`
La forme normalisée est
~~~php
const ASSOC_SCHEMA = [
"?array",
"" => "assoc",
"schema" => [
KEY => VALUE_SCHEMA,
...
],
];
~~~
le type "?array" ou "array" indique si la liste est nullable ou non. la valeur
par défaut est "?array"
chaque occurrence de `KEY => VALUE_SCHEMA` définit le schéma de la valeur dont
la clé est `KEY`
VALUE_SCHEMA peut-être n'importe quel schéma valide, qui sera analysé
récursivement, avec cependant l'ajout de quelques clés supplémentaires:
* description de la valeur dans le contexte du tableau
~~~php
VALUE_SCHEMA = [
...
"name" => "identifiant de la valeur",
"pkey" => "chemin de clé de la valeur dans le tableau associatif",
];
~~~
* s'il s'agit d'une valeur scalaire simple autre que array
~~~php
VALUE_SCHEMA = [
...
"header" => "nom de l'en-tête s'il faut présenter cette donnée dans un tableau",
"composite" => "ce champ fait-il partie d'une valeur composite?",
];
~~~
## Schéma d'une liste (tableau séquentiel ou associatif d'éléments du même type)
Dans la forme courante, on considère que c'est un schéma de nature liste si:
* c'est un tableau avec un unique élément de type tableau à l'index 0, e.g
`[["string", null, "required" => true]]`
La forme normalisée est
~~~php
const LIST_SCHEMA = [
"?array",
"" => "list",
"schema" => ITEM_SCHEMA,
];
~~~
le type "?array" ou "array" indique si la liste est nullable ou non. la valeur
par défaut est "?array"
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary