un simple agrégateur, lecteur de flux rss pour tout suivre .... par: fonds d'écran - Kriss Feed, version : 7 -
  • Friday 26 May 2023 - 14:00
    from Tontof
    Je vous ai dit que j'avais exploré la programmation fonctionnelle avec KrISS aaaa : middleware et il y a quelques années j'ai voulu testé cette même approche pour l'utilisation de schémas json https://json-schema.org

    Le résultat final est plutôt chouette :

    tests suite: nb tests nb files
    draft3: 520/520 35/35
    draft4: 735/735 38/38
    draft6: 995/995 48/48
    draft7: 1286/1286 57/57
    draft2019-09: 1571/1651 59/68
    draft2020-12: 1579/1677 58/68
    draft-next: 1623/1724 58/68

    C'était il y a quelques temps et j'ai dû faire 2/3 modifications pour valider les mises à jours des tests fournis par https://github.com/json-schema-org/JSON-Schema-Test-Suite pour continuer à valider les premiers drafts comme à l'époque où j'avais codé ça.

    S'il n'y a qu'un seul fichier à regarder c'est la validation des URI/IRI à partir de la RFC
    https://github.com/tontof/kriss_json/blob/main/schema/core/inc/rfc.php

    Les validations proposées par PHP ne fonctionnaient pas pour tous les tests, j'ai donc dû lire un peu les RFC pour arriver à la validation de tous les tests. C'est à faire au moins une fois dans sa vie...

    Pour valider un schéma json, il suffit d'inclure le fichier "json.php" et d'appeler la fonction "json_schema"

    <?php 
    include_once(__DIR__ '/schema/json.php');

    $json 'https://json-schema.org/learn/examples/address.schema.json';
    $address file_get_contents($json);

    $data '
    {
      "locality":"locality",
      "region":"region"
    }
    '
    ;
    var_dump(json_schema(json_decode($address), json_decode($data)));

    $data '
    {
      "locality":"locality",
      "region":"region",
      "country-name":"country-name"
    }
    '
    ;
    var_dump(json_schema(json_decode($address), json_decode($data)));

    $data '
    {
      "locality":"locality",
      "region":"region",
      "country-name":"country-name",
      "post-office-box":"post-office-box"
    }
    '
    ;
    var_dump(json_schema(json_decode($address), json_decode($data)));

    $data '
    {
      "locality":"locality",
      "region":"region",
      "country-name":"country-name",
      "post-office-box":"post-office-box",
      "street-address":"street-address"
    }
    '
    ;
    var_dump(json_schema(json_decode($address), json_decode($data)));
     
    ?>

    Ce qui donne comme attendu :

    bool(false)
    bool(true)
    bool(false)
    bool(true)

    En pratique, je vous invite à utiliser une approche plus classique https://json-schema.org/implementations.html#validator-php mais KrISS json reste intéressant de par son approche fonctionnelle