Sujet : Nouveaux paradigmes dans Hoa ? Des explications

Hey smile,

Vous avez sans doute remarqué pas mal de changements dans Hoa ces derniers temps. En effet, Framework.php renommé en Core.php, un nouveau fichier dans le noyau : Event.php … Hmm, mais qu'est-ce que tout cela cache ?

Nouveau paradigme : événements

Un nouveau paradigme est arrivé dans Hoa, celui des événements. En plus, c'est natif car appartenant au noyau. Bonne nouvelle.

Il existe une fonction — qui est un alias — qui permet de manipuler les événements plus facilement et rapidement. Je parle de la fonction event() (alias de Hoa_Core_Event::getEvent(), qui permet un multiton en quelque sorte) qui nous permet de travailler sur un événement particulier. Sur cet événement, on peut attacher des objets, donc event('anEventId')->attach($object, $method). Ça, c'est pour la technique. Mais qu'est-ce que ça veut dire ?

Prenons l'exemple de Hoa_Log.
Avec Hoa_Log, on travaille sur des canaux. Chaque canal permet d'émettre des données de journalisation, des informations de debug etc. Avant, on ajoutait des output streams à l'aide des méthodes addOutputStream() et addOutputStreams() (rappelez-vous, si si smile), maintenant, Hoa_Log émet des événements et à nous de les capturer. Comment ? Facile :

event('hoa://Event/Log/ChanelId')->attach(…);

Hmm, mais qu'est-ce qu'on peut attacher au juste ?
La méthode attach() fonctionne comme une méthode de callback :

event(…)->attach('class', 'method');
event(…)->attach($object, 'method');

Jusque là, facile, on sait faire, du grand classique.
Mais dans Hoa, depuis déjà plusieurs mois, un paradigme se déploie gentiment, celui des flux ! Donc si on met un flux comme objet, la méthode devient facultative :

event(…)->attach(
    new Hoa_File_Write('hoa://Data/Temporary/Foobar.txt')
);

En fonction du type de la données envoyée, le notificateur va trouver quelle méthode appliquer (je vous rappelle que les interfaces de flux de type IO — Hoa_Stream_Io_In et Hoa_Stream_Io_Out — sont assez complètes).

Mais on peut aller encore plus loin ! Hoa est compatible PHP 5.3 non ? Et bah allons-y :

event(…)->attach(function ( Hoa_Core_Event_Bucket $e ) {

    var_dump($e->getData(), $e->getSource());
});

Notez que le type du paramètre de la fonction anonyme n'est pas obligatoire car aucun moyen de vérifier ça dans PHP actuellement …

Ok, retournons donc à notre Hoa_Log.
Les logs émettent des données. On veut les écrire dans un fichier texte :

event('hoa://Event/Log/ChanelID')->attach(
    new Hoa_File_Write('hoa://Data/Temporary/Foobar.txt')
);

Jusque là, ok, pas de soucis.
Mais si maintenant on souhaite écrire dans un flux XML ?

Nouveau paradigme : les flux (composites)

Hoa tent à s'uniformiser et à devenir de plus en plus modulaire, notamment grâce au flux. On trouve par exemple Hoa_File, Hoa_Socket ou Hoa_Php_Io qui sont des flux de « bas-niveaux ». Il ouvre des fichiers, des terminaux, savent lire et écrire dedans. Seulement, ils sont incapables de donner une interprétation à ce qu'ils lisent ou écrivent. Si on a du XML, il peut être contenu dans un fichier ou une socket, mais ça reste du XML, il doit être compris/interprété comme du XML ! C'est pourquoi on a les flux composites : des flux qui englobent des flux pour leurs donner une sémantique, un sens, une interprétation.

Le premier du genre est Hoa_Xml. Exemple d'utilisation :

$xml = new Hoa_Xml_Read(
    new Hoa_File_Read('hoa://Data/Temporary/Foobar.xml')
);

On peut très bien passer un objet de type Hoa_Socket à la place de Hoa_File, ça fonctionnera pareil (merci les interfaces Hoa_Stream_Io_*, aux nombres de 9 actuellement). Et c'est parti, on peut lire un fichier XML.

Donc si on se replace avec nos logs :

event('hoa://Event/Log/ChanelID')->attach(
    new Hoa_Xml_Write(new Hoa_File_Write('hoa://Data/Temporary/Foobar.xml'))
);

Dès qu'un log sera émis sur le canal ChanelID, alors les données seront transformées en XML puis écritent dans le fichier XML, fichier situé à l'emplacement hoa://Data/Temporary/Foobar.xml, chemin relatif à chaque application en fonction des configurations du protocol hoa:// ! Ahh, si peu de lignes et tellement de sueur smile.

Mais allons plus loin encore.
Hoa_Xml n'est pas un simple flux composite. En effet, il implémente l'interface Hoa_Stream_Io_Structural. Hmm, mais qu'est-ce ?
Cette interface nous dit que le flux manipulé est une structure … comme un arbre par exemple ! Quand on ouvre un fichier XML, on obtient un arbre sur lequel on peut se déplacer, interagir, modifier, écrire, lire etc.

Grâce à notre dernière interface, on peut se déplacer facilement à partir des méthodes select*() (comme selectElement(), selectDescendantElement(), selectChildElement(), selectAdjacentSiblingElement() etc.) mais également avec querySelector() (mais si, les sélecteurs CSS3, vous les connaissez smile). Comme on est sûr du XML, on a également xpath() (méthode non définie dans l'interface mais présente dans la classe).

Soit, amusons-nous smile :

$x = new Hoa_Xml_Write(
    new Hoa_File_Write('hoa://Data/Temporary/Foobar.xml')
);
event('hoa://Event/Log/ChanelID')->attach(
    $x->querySelector('foo > bar#baz[attr^=gordon]:first-child')
);

Qu'est-ce que ça signifie ? On ouvre un fichier XML. Ensuite, on fait un querySelector() dessus, donc on se place à un endroit précis du fichier. querySelector() ne retourne que le premier élément si plusieurs sont trouvés (sinon il faudra utiliser querySelectorAll()). Et ce sera cet élément, qui est lui aussi un flux (!), très important, qui va recevoir l'événement, le transformer et l'enregistrer dans l'arbre XML.
Une fois que le fichier va se fermer, l'arbre va se transformer en chaîne de caractères et s'écrire dans le fichier.

Là, ça devient sympatique, mais très puissant. Et surtout, très très simple. Il est parfaitement naturel et simple d'écrire ce genre de code.
Un avantage ici, si on ne veut pas travailler sur un XML mais du JSON, il suffira d'écrire Hoa_Json_Write à la place de Hoa_Xml_Write et le tour sera joué (mais Hoa_Json n'est pas encore refait, une question de jour wink). Vous voyez la généricité ici ?


Voilà. C'était un petit aperçu de la prochaine mouture de Hoa. De gros changements, mais on y gagne énormément.
Je voulais juste vous dire que c'est ça que je voulais avec Hoa. Une API simple, puissante et très uniforme. Il m'a fallu du temps pour y arriver. Beaucoup de recherche. À chaque fois qu'on me posait la question : « Mais tu veux faire quoi avec Hoa ? », je répondais : « J'ai des idées, il faut me laisser le temps, vous allez voir », maintenant je répondrai : « J'y suis arrivé, mais ce n'est que le début smile ».

Je me replonge dans Hoa_Xyl wink.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

2

Re : Nouveaux paradigmes dans Hoa ? Des explications

C'est vrai que ça a l'air pas mal.
Il me tarde de regarder ça de plus près!