Topic: Passage de mon architecture pseudo MVC à Hoa

(gros boulot, en perspective autant pour moi que pour vous big_smile)

Alors voilà dans le cadre d'une restructuration partielle, j'ai décidé de me lancer dans le passage d'un site de mon architecture à l'utilisation de Hoa.
Pour commencer, voici ce que donne l'architecture actuelle:

/
    /libs
    /img
    /config
    /tmpl
        /site1
            page1.tmpl.php
            page1.mdl.php
            [...]
        /site2
            [...]
controlleur.php

Donc en gros, répertoire libs pour les classes de cache, de formatage de données, etc...
img et config parle d'eux même...
Et enfin le repertoire tmpl dans lequel il y a plusieurs repertoires concernant les différents sites (aux nombres de trois aujorud'hui, je vous laisse visionner http://galapiat.fr pour mieux comprendre: pages communes, compagnie, festival)
ça rajoute je suppose un peu de difficulté? puisque ce sont trois design/structures distinct(e)s!

Voilà pour la structure, et maintenant le fichier controlleur.php:

<?php
//coding: utf-8  (Scite configuration)

include('./libs/mysql_utf8.php');
include('./libs/cache.class.php');
include('./libs/format.class.php');
include('./libs/pagination.class.php');
include('./config/config.php');


if(empty($_GET['p']))
    $_GET['p']='accueil';
if(isset($_GET['d'])){
    if(empty($_GET['d'])) $_GET['d']='divers';
    $sql='SELECT * FROM pages as p, repertoires as r WHERE r.id_rep=p.id_rep AND p.nom ='.$connexion->quote($_GET['p']).' AND r.nom='.$connexion->quote($_GET['d']);
    $resultats=$connexion->query($sql);
    $page= $resultats->fetch(PDO::FETCH_ASSOC);
    if(!$page){
        include('./tmpl/divers/404.mdl.php');
        exit();
    } elseif($page['ouvert']=='0'){
        include('./tmpl/divers/fermeture.mdl.php');
        exit();
    }
} else {
    include('./tmpl/divers/404.mdl.php');
    exit();
}

//nom du fichier de cache
$cache_name=$page['id_page'];
if(!empty($_GET['a'])){
    $cache_name.='_a'.$_GET['a'];
}
if(!empty($_GET['page'])){
    $cache_name.='_p'.$_GET['page'];
}

//démarrage du cache
try{
    $cache=new cache($cache_name);
    $cache->initCache((is_numeric($page['cacheType']) ? intval($page['cacheType']) : $page['cacheType']));
} catch (Exeption $e){
        echo $e->getMessage();
}

include($page['url_model']);
?>

En gros il sert à inclures les différentes librairies pour plus tard (bien que ce ne soit pas forcément très clair je l'accorde, par exemple la classe pagination ne sert pas sur des pages statiques et pourtant elle est là... sad )
Ensuite, on cherche la page demandée (je vous donnerai le .htaccess si vous voulez), si elle est valide, hop on se prépare à inclure, sinon on inclu la page 404 ou fermeture, jusque là ça va?

Ensuite si pas de problème démarrage du cache, et inclusion de la page .mdl.php
qui contient par exemple:

<?php 
//coding: utf-8  (Scite configuration)

$title=$CONFIG['titleDivers'].$page['title'];
$css=$page['url_css'];


//inclusion de la vue
include($page['url_vue']);
?>

C'est dans ces pages (.mdl.php) qu'on peut retrouver des appels à la bdd, des traitements, etc...

Voilà
Bon je sais pas trop comment procéder pour passer à Hoa
Je croit que ce qui me pose le plus de problème actuellement, c'est comprendre comment organiser les fichiers (noms,place,etc...)
Parce que passer de mon système de cache à celui de Hoa ne devrait pas être très difficile par exemple...
Mais c'est surtout l'organisation...
Bon je m'arrête là pour le moment, mais je peux apporter toutes sortes de précisions supplémentaires!
Merci d'avance pour l'immense aide apportée


Ps: peut-être que ça permettra au logo Hoa  de se promener un peu wink

Re: Passage de mon architecture pseudo MVC à Hoa

Hey smile,

Oui, le logo Hoa aime se promener sur la toile tongue.

Sinon, voici comment tu pourrais procéder grosso modo et si j'ai tout compris.
Ton dossier /libs/ pourrait être renommé en /HomeMade/ par exemple. Le dossier /img/ irait dans /Webroot/Media/Image/. Note, ceci est facultatif, c'est juste mes habitudes personnelles. Enfin, /config/ irait dans /Data/Configuration/ (à transformer en XML, INI, YAML ou PHP), et tu lances la commande $ ./hoa maintenance:cache pour générer les caches des configurations (accessible avec la constante HOA_DATA_CONFIGURATION_CACHE).
Pour les gabarits, c'est particulier. On va dire que tu as le dossier /Application/ qui concerne une application normalement. Donc, on pourrait soit avoir /Application/Site1/, /Application/Site2/ etc. ou /AppSites1/, /AppSite2/ etc. Dans les deux cas, il faudra modifier les chemins d'accès à l'application : voir le fichier /Data/Configuration/Controller.yml, ou sinon tu passes manuellement un tableau au contrôleur frontal (classe Hoa_Controller_Front), ce qui sera sûrement ton cas car plusieurs fichiers d'amorçage (bootstrap).

Dans tes fichiers d'amorçage justement, tu peux inclure tes classes personnalisées, mais pas besoin d'utiliser le cache ou MySQL, Hoa supporte déjà tout ça (à travers Hoa_Cache et Hoa_Database). Après, tu as des conditions bizarres dans ton contrôleur frontal que j'ai du mal à saisir, à toi de modifier, je t'énonce une ligne directrice.

Enfin, tu pourras éclater tes fichiers en séparant bien les traitements de données dans les modèles, et l'assignation (avec une légère manipulation) des données dans les contrôleurs d'applications. Bien sûr, la vue sera répartie dans le dossier prévu à cet effet ('faut imaginer les gestes des hôtesses de l'air wink).

Est-ce que ça t'aide un peu ou pas du tout ?

« 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. »

Re: Passage de mon architecture pseudo MVC à Hoa

Bon alors, c'est un petit peu mieux, mais c'est vraiment pas encore ça ... sad

Déjà, c'est sur que pour le cache, Hoa_cache me conviendra parfaitement!
Et pour MySql, le fichier mysql_utf8.php n'est pas une classe, c'est juste l'instanciation de PDO et la commande SET NAMES UTF8 sui sont regroupés à l'interieur...

Pour ce qui est des fichiers de config, j'en ai un pour mysql (un array d'identifiants) et un pour le site, un array également et le tout en php, je fait juste un include dessus, mais après je pense que ça sera plus simple de le mettre en INI ou YAML.
mais j'ai rien compris à ce que tu racontes sur le cache de config...? (faudrait que je relise la partie sur la console dans le manuel)

Et le plus gros boulot, les gabarits...
Et ben c'est pas gagné, j'ai pas compris l'histoire des chemins et des bootstraps...
Pour expliquer mes conditions dans le controlleur, en fait c'est plutôt simple:
On cherche en base de donné l'entrée qui correspond au repertoire actuel et au nom de fichier et qui n'est pas fermée par l'administration (pour maintenance par exemple),
Si elle existe, on a donc diverses infos (url du css, titre de la page, etc...)
Sinon on inclus soit la page 404 pour dire "oh! tu vas où là?", ou la page fermeture pour dire "revenez plus tard!"

pour info la ligne de mon .htaccess:

RewriteRule ^(([a-z0-9-]+/)*([a-z0-9-]+/)?)(([a-z0-9-]+)\.html)?$  /devweb/galapiat/controlleur.php?p=$5&d=$1 [L]

Je sais pas si c'est clair, ce qu'il y a de bizard ou d'aberrant pour toi (te gène pas dit moi ça peut que me faire avancer!!)

Et j'ai pas compris là:

Enfin, tu pourras éclater tes fichiers en séparant bien les traitements de données dans les modèles, et l'assignation (avec une légère manipulation) des données dans les contrôleurs d'applications.

Bon alors tu doits te dire, mais m****e il est bouché ou quoi? hmm
Et je t'en voudrait pas tongue
En fait je comprend beaucoup mieux par l'exemple, alors si tu veux on peut laisser un peu en suspend ce sujet, pour que tu te consacres à la redaction d'un tutoriel (ou a une vidéos sans flash hihi wink )
En tout cas, merci pour les réponses wink
Je comprend vite mais faut pas me brusquer tongue

Re: Passage de mon architecture pseudo MVC à Hoa

Commençons par les choses simples. Le chapitre du manuel Hoa_Console explique le fonctionnement du paquetage Hoa_Console et non pas le fonctionnement de l'interface en ligne de commande de Hoa.
Les configurations peuvent être centralisées dans Hoa ; de cette façon, on évite de re-configurer tous les paquetages manuellement dans le code. Seulement, les configurations ne sont pas compréhensibles par PHP directement, on doit utiliser des parsers ou ce genre de chose. Pour ne pas plomber les performances, on met en cache les configurations des paquetages.
Les configurations se trouvent dans /Data/Configuration/, et les caches dans /Data/Configuration/Cache/. Attention, je ne parle ici que des caches des fichiers de configuration, et pas des caches d'application (avec Hoa_Cache par exemple) !
Enfin, pour générer (ou re-générer) les caches des fichiers de configuration, on utilise la ligne de commande suivante :

/Data/Bin/ $ ./hoa maintenance:cache

Si jamais tu as un doute, saches que l'option --help (ou -?, ou encore -h) est accessible sur toutes les commandes pour obtenir de l'aide.

Revenons à nos moutons.
Si tu utilises l'architecture classique, le dispatche se fera naturellement (i.e. sans toucher aux configurations initiales) et normalement.
Tu as une vérification d'activation d'un module, soit, dans les méthodes init (ou dans toutes les méthodes) de tes contrôleurs primaires tu peux écrire une vérification d'activation. Résultat donné grâce à un modèle : si le modèle retourne une erreur (ou un code particulier), on n'y a pas accès, donc redirection, sinon on en profite pour récupérer les données comme le titre, les adresses vers les feuilles CSS etc. Ensuite, le contrôleur assigne ces valeurs à la vue, et le tour est joué.
Tu parles d'erreur 404. Attention à différencier cette erreur avec le fait qu'un module ne soit plus accessible, ce n'est pas pareil. En revanche, si tu veux avoir des erreurs 404 personnalisées, ça peut se faire en capturant l'exception Hoa_Controller_Exception_ControllerIsNotFound (ou ActionIsNotFound).

Donc tu n'as plus de tests dans ton fichier d'amorçage. Chaque contrôleur a le sien.
Bon … c'est peut-être un peu prématuré, mais si tu boucles sur une suite de contrôleurs, tu peux t'amuser à avoir un contrôleur qui ne s'occupera que du test d'activité des contrôleurs suivants. Mais si tu restes sur l'idée d'un modèle commun à plusieurs contrôleurs, c'est une solution tout à fait viable et correcte.

On parlera du fait d'avoir plusieurs applications qui partagent des données en commun plus tard wink.

Enfin, je n'ai pas le temps pour faire des tutoriels en ce moment. Les cours de l'université me prennent beaucoup de temps, et j'ai des stages à préparer également. En parallèle, je travaille sur la refonte de certains paquetages de Hoa (révision du code et amélioration), ainsi que la documentation. J'aimerais en finir avec cette révision complète pour me concentrer sur des tutoriels et ce genre de chose, crois-moi smile. Ah, j'oubliais, je bosse aussi sur le serveur … SVN est en place, reste à programmer le système de miroir. Fiou !

« 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. »

Re: Passage de mon architecture pseudo MVC à Hoa

Bon une réponse rapide pour dire que je suis pas mort wink
Mais que le temps me manque également, donc je reprendrais tout ça d'içi une petite semaine, je ferais des tests plus poussés,
Et je te redemanderais pleins de trucs sur ce que tu viens de dire wink
Merci et bon courage pour les stages/cours/etc...

Re: Passage de mon architecture pseudo MVC à Hoa

Merci, et j'attends tes questions avec impatience smile.

« 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. »

Re: Passage de mon architecture pseudo MVC à Hoa

Bonjour,
me revoilà pour une petite question "intermédiaire",
Je me demandais une chose, vu qu'il est possible de faire ce genre de chose:

try {
    $controller->dispatch();
} catch ( Hoa_Controller_Exception_ControllerIsNotFound $e ) {

       $parametre404=...;
       $controller->addRequest(0, $parametre404);

}

Quelle est l'utilité de ma base de donnée à ce moment là?
Ce qui pourrait me manquer à priori, c'est que j'avais dans ma table de répertoires un champ par exemple qui indiquait si oui ou non le repertoire povuait accueillir des albums photos...
Et celà servait dans le backend à attribuer les novueaux albums à tel ou tel repertoire...
Comment remédier à celà? garder la base de donnée, mais elle ne sera utilie que pour le backend? du coup pour l'intégrité des données, il faudra bien faire attention à mettre à jour la base correctement...

Un autre exemple, dans ma table de pages, j'avais un champ pour le temps d'expiration des caches (selon si on est sur une page de chat, de news ou une page statique), comment faire celà, dans la méthode init() de chaque class correpondant?

Je pense bien que c'est pas forcément clair ce que je raconte, mais n'hésites pas à me demander plus d'infos wink
merci encore!!

Re: Passage de mon architecture pseudo MVC à Hoa

Je ne vois pas le rapport entre le faire d'avoir une exception Hoa_Controller_Exception_ControllerIsNotFound et ta base de données.

Tes accès à ta base de données se font à travers tes modèles (ou directement dans le contrôleur, mais ce n'est pas top niveau maintenance … ça dépend des fois quand même). Tu gères tes modèles dans tes contrôleurs, et distinctement dans chaque contrôleur. Si tu es dans le contrôleur réservé aux erreurs 404, tu n'auras peut-être pas à gérer les même modèle que si tu es dans ton contrôleur de galerie.

Comme je ne comprends pas trop où tu veux en venir, j'attends plus de précisions avant de me lancer dans des explications plus approfondies smile.

« 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. »

Re: Passage de mon architecture pseudo MVC à Hoa

Edit, je ne fait pas l'amalgame entre les exeptions du controlleur frontal et Hoa_Database, rassures-toi,!
Je veux simplement savoir comment changer mon modèle de données concernant les pages et les repertoires...
Alors en fait, mes deux tables repertoires et pages me servaient à plusieurs choses:

  • Vérifier que la page existe bel et bien en faisant une requête jointe sur les deux tables, si il n'y avait pas de résultats, c'est qu'on essayer de voir une page qui n'existait pas, donc, => 404
    Pour cette fonctionnalité Hoa se passe de bdd, puisque si il ne trouve pas la classe et la méthode correpsondant au repertoire (module pour Hoa serait plus juste) et à la page (=module) alors on est capable de le détecter et donc de renvoyer sur une erreur 404

  • On a ensuite les autres fonctionnalités, qui étaient savoir si un repertoire peut contenir des galeries, des news (utile pour le backend)...
    Pour ça je pense qu'un fichier de conf serait approprié, puisque ce ne sont pas des valeurs qui changent tout les jours...

  • Pour ce qui est des pages, j'avais des infos diverses tel que titre, url du css (qui variait selon les repertoires), mais ça c'est tout à fait possible de les initialisés dans la méthode init() des controlleurs...

  • Pour finir, savoir le temps d'expiration des pages qui varie suivant le type d'infos qui s'y trouve...
    Alors ça je sais pas trop comment m'y prendre, car faire une entrée par page dans un fichier de config va finir par être long, donc peut-être que désigner une valeur par défaut dans la config, et la changé manuellement suivant les controlleur?

J'ai peut-être oublier deux trois trucs mais voilà pour l'idée générale!
Donc la question est: Penses-tu que je puisse me passer de ces deux tables?
Si oui est-ce que les manières quej'ai évoqué te semblent bonnes?

Annexe: Est-ce que je me gourre complètement dans ma reflexion?
Merci d'avance

EDIT: je viens de me rendre compte d'autres, choses, si je n'ai plus de tables "repertoires", je ne saurait plus retrouver à quel repertoire appartient tel ou tel album photo ou tel news...
à près je peux peut-être attacher un ID à mes repertoires dans le fichier de conf? et ensuite faire une "pseudo-jointure" donc entre le fichier de confs et ma base de donnée?

Last edited by jojolapine (09 Dec. 2008 21:47)

Re: Passage de mon architecture pseudo MVC à Hoa

Bon, prenons un bon thé noir, deux sucres, Carl Orff (Carmina Burana) en fond, et on s'y met.

Ce que tu veux faire est intéressant et je pense qu'il faut oublier ce que tu as fait précédemment pour se concentrer sur la nouvelle architecture.

Pour la gestion des pages, oui, plus besoin d'une table particulière, Hoa gère ça tout seul, et te retourne les bonnes exceptions. Donc ta table ne te sert à rien.

Pour savoir si le répertoire peut contenir certaines fonctionnalités, tu peux conserver ta table, et tu fais un modèle qui interroge la base de données. Tu aurais une méthode précise qui pose la question : quels sont les fonctionnalités pour moi ? Ou encore : est-ce que j'ai le droit d'utiliser cette fonctionnalité ? Attention, ce n'est pas la même chose, car pour une question de droit, on peut imaginer des ACL … Tout un programme wink. Il faut voir comment tu veux gérer ça, mais je pense que ça ne serait pas forcément nécessaire : ça se discute en tout cas.

Pour les informations des pages comme le titre, les liens vers les feuilles CSS etc., tu peux te faire un autre modèle qui — en fonction du contrôleur — va chercher les informations nécessaires dans la table. Et le contrôleur récupère les informations du modèle pour les assigner à la vue. Cas classique, pas de problème.

Par contre, le dernier point m'intrigue. Le temps d'expiration, c'est quoi ? C'est un cache HTTP ? Parce que, sans savoir précisément ce que c'est, le principe est le même que pour les titres et liens vers divers éléments de la page. Dans la même (ou une autre) table, tu as cette information, et c'est le contrôleur qui la traite (je te rappelle que la couche Hoa_Controller_Response a une gestion des en-têtes HTTP simplifiées qui ne nécessite pas de gérer des tampons de sortie etc.).

Donc si j'ai bien tout saisi, tu n'aurais besoin que d'une table au final. Et ton raisonnement semble cohérent.

Regarde bien ce que tu pourrais faire avec les ACL. N'oublie pas que les ACL peuvent servir pour autre chose que l'utilisateur … un module par exemple ?

« 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. »