[Debutant] Organisation des données

Eléphant du PHP | 189 Messages

05 août 2009, 15:24

"Re" Bonjour à tous,

Après avoir résolu mon problème de séparation des données

Je continue dans ma quête de l'orienté objet. J'ai trois questions à vous soumettre :

1) Comment faire pour permettre à une classe d'accéder au méthode d'une autre classe instanciée avant celle-ci..
..
</head>
<body>
<?
  $mysql = new MySql();

  $user= new User();
?>
</body>
</html>
Ma classe User aura besoins de faire des requêtes sur la base de donnée, je voyais trois solutions la qu'elle est la plus appropriée ?

a) Je lui passe $mysql en paramètre .
$user = new User($id,$mysql);
b) J'utilise une global dans ma classe qui me permet d'accèder a $mysql
class User {
function __construct() {
   global $mysql;
}
}
c) J'instancie une nouvelle fois ma classe dans User ?

2) Seconde question, dans ma class Nagios, j'ai ce type de donnée :
Serveur
|--> Status Ok
|--> Date : Now
|--> Groupe : Groupe1
|--> Nextcheck : Dans 10min
|--> Maintenance
|------> Demain 18h
|------> Après demain 14h
Comment je peux les organiser ?

a) Une class NagiosItem qui me permettrait d'avoir en retour de $nagios->Maintenance() le tableau attendu et les info avec les accesseur ?

b) Un tableau à plusieurs dimensions ?



3) Et pour terminer la troisième question : pour ma class Nagios j'aurais (pour le moment) deux méthodes :
$nagios->etatServices()
Qui me rendra les états actuels de mes services ( Web: Ok, Mysql: Ok, Mail: Ok, Irc: Down, Ftp: Maintenance)

Pour avoir ce genre d'info je dois faire une requête assez lourde :

Code : Tout sélectionner

SELECT npc_services.display_name,npc_servicestatus.current_state,npc_scheduleddowntime.id FROM npc_services INNER JOIN npc_servicestatus ON npc_services.service_object_id = npc_servicestatus.service_object_id LEFT JOIN npc_scheduleddowntime ON npc_scheduleddowntime.object_id = npc_services.service_object_id
Je suis obligé de faire ces jointures, le status etant dans une autre table que le nom, et le maintenances également

Cette requete sera effectuée uniquement sur ma page d'accueil, je n'indique pas le status partout..

Ensuite, sur une autre page ( disons statuts.php) je voudrais afficher l'ensemble des services, des maintenances et des statuts et pour ça voici la requête :

Code : Tout sélectionner

SELECT npc_services.display_name,npc_servicestatus.output,npc_servicestatus.current_state, npc_servicestatus.current_check_attempt,npc_servicestatus.max_check_attempts, npc_servicestatus.last_check,npc_servicestatus.next_check,npc_servicestatus.last_state_change,npc_servicegroups.alias, npc_scheduleddowntime.author_name,npc_scheduleddowntime.comment_data,npc_scheduleddowntime.scheduled_start_time,npc_scheduleddowntime.scheduled_end_time FROM npc_services INNER JOIN npc_servicestatus ON npc_services.service_object_id = npc_servicestatus.service_object_id INNER JOIN npc_servicegroup_members ON npc_servicegroup_members.service_object_id = npc_services.service_object_id INNER JOIN npc_servicegroups ON npc_servicegroup_members.servicegroup_id = npc_servicegroups.servicegroup_id LEFT JOIN npc_scheduleddowntime ON npc_scheduleddowntime.object_id = npc_services.service_object_id
Je suis certain qu'il y a moyen de rajouter encore un ou deux champs (peut être même un JOIN)..

Et voilà la question :

a) Pensez-vous que je devrais lors de l'instance de ma classe faire la grosse requête et récupérer mes informations utiles en fonction de la page ?

b) Ou alors, je fais ma première requête et si je vais sur la page statuts.php je complète mes informations ? (Ou je les récupères toutes sachant que je suis plus a 3 champs prêt)

Je sais que ces questions peuvent vous paraitre simple, mais j'essaye actuellement de refaire mon site en POO et je veux le faire bien..

Merci de m'avoir lu, j'attends vos réponse !!

Bonne fin de journée

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 août 2009, 19:25

Concernant la question 1)

a) bien
b) :afraid: oublie toute idée de variables globale, c'est pas propre, pas secure, et c'est dur de debugger ensuite.

Donc, tu t'en doutes, je te conseille la solution a)

Maintenant, tu as 2 soutions :
1/ soit tu passes la connexion au constructeur, c'est clair une bonne fois pour toute et tu as fini le taf.
2/ soit tu construis un accesseur d'instance pour ta classe de base de données (Singleton, il y a d'ailleurs un sujet en cours qui traite de ce point)

Je te conseillerais la seconde solution.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 août 2009, 19:26

Concernant la question 2)

Si tu essayes de passer ton projet en full OO, je te conseille la classe.
Une classe "Server" qui contiendrais toutes les méthodes de récupération de données, d'organisation et de traitement.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 189 Messages

05 août 2009, 20:04

Merci zeus,


Pour ta réponse concernant le singleton et le multiton, je vais donc procéder comme ça..

Pour le seconde question, le soucis en fait ce situe au niveau "Organisation des données" car je compte faire une class Nagios ( Supervision du serveur)
Dans cette classe, je peux récupérer les données de plusieurs Serveur/Service/Outils qui sont supervisés ( ex : Serveur ftp,mail,web,mysql. Outils: script, Service: SSL, ..)

Toutes ces données on les informations suivant :

Code : Tout sélectionner

Nom du serveur Dernière verification Etats Groupes Maintenances => Tableau(Maintenance1, Maintenance2, ..)
Mon idée était : dans le constructeur récupérer l'ensemble des données de nagios ( Dans la class Nagios) et ensuite dans ma class Nagios instancier des class NagiosItem (Qui lui contiendrai l'ensemble des données cité ci-dessus) . Ces instance de NagiosItem serait contenue dans un tableau de ma class Nagios..

Je suis dans le bon ou pas ?

(Par contre, pour ma 3 ieme question, j'hésite niveau "optimisation" est-ce utile d'instancier tous mes NagiosItem avec la grosse requête pour accéder a 4 ou 5 item (et encore uniquement au donné : Etats,Maintenance,Nom du serveur) 90% du temps, et accéder à tout les items (et toutes les données) 10% du temps ?)

Un tout grand merci pour tes renseignements

Mammouth du PHP | 991 Messages

07 août 2009, 12:55

J'ai lu ton sujet en diagonale.

Je ne saurais trop te conseiller de séparer dans des fichiers disctints tes données sql (mysql_query) et ton traitement (foreach( .... ))

si tu as de la maintenance a faire sur ton projet tu me remerciera a n'avoir que quelques fichiers a modifié ;)

Je serais plutot d'avis de faire une sorte de cache des tes données surtout si le traitement est long.
Peut être en faisant un petit fichier xml contenant tes données ... a voir si le temps de réponse à un gain ou pas je ne saurais te dire la tous de suite.

Quand tu hésite entre deux solutions il vaut mieux tester différents cas , et prendre celui qui demande le moins de ressources.

Bye Hawk
DevOps, Symfony4, Hoa