[POO]Méthode correcte pour une forum ?
Bonsoir à tous et à toutes
Je suis nouveau sur ce forum et je n'ai pas vu de section pour me présenter. Je vais donc rapidement me présenter. J'ai 17 ans, je code un peu PHP (poo récement) et j'ai pour idée de faire un CMS.
Celui la est bien avancé, cependant je refais très souvent la base de l'appli pour essayer d'avoir toujours quelque chose de mieu que les fois précédentes car je me retrouve vite bloqué (par manque de flecibilité ou alors la façon dont j'ai codé par exemple l'accès à PDO me posé des problèmes par la suite notament par héritage xD mais j'ai opté pour un design pattern singleton ^^) :(
J'ai trouvé une bonne base et je vais donc y partir vraiment dessus (faut juste que je comprenne un peu mieu le MVC :p) donc en faite lorsque j'ai besoin d'avoir un accès à la base de donnée, je me sers de l'instance de PDO, ce qui m'évite les héritages ou tous autres problèmes.De plus j'utilise la connexion à PDO que quand nécessaire donc gain de ressource :)
Bref la n'est pas la raison du sujet ^^ c'était juste pour préciser comment je me base :)
Vous avez pu le lire sur le titre du topic, je cherche à réaliser un forum. Cependant je souhaiterai avoir quelques avis (et éventuellement un peu d'aide si pas dutout bon) sur ma façon de procéder.
Je dispose d'une classe user qui me permet la gestion des membres, la visualisation du profil etc... quelque chose de standart ^^
J'ai pour idée de créer deux autres classe topic pour la gestion des topics (topic pour l'ajout de topics et messages et topicManager pour la gestion des topics (affichage,suppression etc...).
De même je compte créer 2 classes du même type pour l'affichage et la gestion des forums et catégories. Peut-être faudrait t'il les séparer ?
Je block un peu sur la façon dont je peux m'occuper de la gestion des droits sur le forum :s (classe séparée ou alors avec les utilisateurs (il y aurait que quelques niveaux : users, modo, admin et éventuellement quelques VIP, codeurs ou autre... enfin la c'est plus des groupes d'utilisateurs que des accès à différentes sections du forum et site...). Je pense que tout y est, je suis cependant pas tout à fait sur de la façon dont je procède et je demande donc votre aide.
J'ai déjà lu ce sujet http://www.apprendre-php.com/forums/topic-141-poo-forum-optimiser.html qui ma grandement aidé mais pas tout non plus ^^
Je pense que la de "couper" en deux les classes est bien mais pas sur non plus.
Si vous pouviez m'aider sur la façon de procéder svp ce serait super !
Il est vrai que je me suis très mal exprimé ^^ mais entre la fatigue, l'heure etc.. c'est dur :p
Si vous souhaitez quelque chose de mieux, demandez moi !
Merci beaucoup ! Bonne soirée :)
Réponses apportées à cette discussion
Salut,
Le design d'un forum n'est pas une chose aisée mais je vois que tu sembles avoir déjà de bonnes bases en OO pour bien démarrer. J'ai plusieurs suggestions à te faire pour ton forum. Pour la première, je t'invite sincèrement à utiliser l'ORM Doctrine pour ton projet qui te permettra de gérer en toute simplicité les accès à la base de données (quel que soit son type : oracle, mysql, sqlite, mssql...). Doctrine est une API écrite en PHP qui te permet de manipuler une base de données au travers d'objets PHP, ce qui te permet de ne pas à avoir à écrire de requêtes SQL à la main. D'autre part, Doctrine génère les classes PHP de base à ta place, ce qui te fera gagner un temps non négligeable. Enfin, cette API dispose de "behaviors (comportements)" qui te permettent d'appliquer des comportements particuliers à tes tables. Par exemple, une table Category avec le behavior "nested set" de Doctrine permettra à tes objets Category de se comporter comme des arbres hiéarchiques. C'est très pratique pour représenter des forums, sous-forums, sous-sous-forums... Déjà commence à implémenter Doctrine dans ton projet. A partir de là, tu pourras ensuite construire la logique métier de tes classes.
En ce qui concerne les droits d'utilisateurs, tu peux te créer des tables User, Group et Permission, lesquelles sont liées entre elles avec des relations n:n. Par exemple : UserHasGroup, UserHasPermission, GroupHasPermission. Cela te permettra de gérer les groupes auxquels sont associés les utilisateurs, ainsi que les permissions associées aux groupes et aux utilisateurs.
Supposons ainsi que ton utilisateur User ait le rôle MODERATOR, alors il pourra supprimer un objet Topic. Ce droit peut se représenter ainsi dans tes classes de modèle générée par Doctrine :
<?php
class fmUser
{
protected $groups = array('MODERATOR', 'VIP');
public function hasRole($role)
{
foreach ($this->groups as $group)
{
if ($role === $group)
{
return true;
}
}
return false;
}
}
class fmTopic
{
public function isDeletableBy(fmUser $user)
{
if ($user->hasRole('SUPERADMIN'))
{
return true;
}
if ($user->hasRole('ADMIN'))
{
return true;
}
if ($user->hasRole('MODERATOR'))
{
return true;
}
return false;
}
}
Ce qui donne au final dans les implémentations :
<?php
// Récupération du topic et du user depuis la bdd
$user = Doctrine::getTable('fmUser')->findOneById(12);
$topic = Doctrine::getTable('fmTopic')->findOneById(45);
// L'utilisateur a-t-il le droit de supprimer le topic ?
if (!$topic->isDeletableBy($user))
{
// Pas le droit donc on redirige vers une page d'erreur
redirect('http://domain/somewhere');
}
// Il a le droit, donc on supprime le topic
$topic->delete();
// On redigire vers une page
redirect('http://domain/somewhere-else');
Tu vois le principe ?
++
Hugo.
Moi je comprend pas pourqu'oi les méthode telle que
public function isDeletableBy(fmUser $user)
tu la met dans la classe fmTopic.
Alors que si on suit une logique ancestrale (je m'enflamme) du sujet , verbe et on se pose la question que fait l'action.
On devrait faire :
public function canDeleteTopic($topic)
et le mettre dans la classe User ..
Bref ... je dis n'importe quoi?
@saturn1 : les deux façons de procéder sont exactement similaires. Le développeur choisit celle qu'il préfère. Toutefois, j'ai une légère préférence car elle permet de répartir de manière homogène la gestion des ACLs dans tous les objets du modèle. Chaque objet du modèle dispose ainsi de ses méthodes isDeletableBy(), isEditableBy(), isPublishableBy()...
En revanche, en créant toute une série de méthodes can() dans le modèle User, on surcharge inutilement la classe et l'objet User aura ainsi tendance à avoir trop de responsabilités. Imagines le nombre de méthodes can() si tu as des objets Category, Topic, Post, Alert... et que pour chaque tu dois gérer l'ajout, la suppression, la modification, la publication, la duplication... Ca devient vite lourd...
Oui c'est vrai...
Mais là si tu vois ce que je veux dire tu utilises le passif...
Bref merci!
Bonsoir,
Merci pour vos réponses, surtout toi Emacs, ton exemple avec ORM Doctrine me donne bien envie d'aller voir un peu plus en détail la chose. De plus (à voir rapidement la documentation), il me parait effectivement super pour gagner du temps.
Je n'ai jamais été très passionné par les frameworks, cependant celui la me parait très bien :) notament le principe de behavior, il me rendra énormément service :D
Pour ce qui est de l'utilisation en ressource, je ne sais pas encore. Je te laisse éventuellement m'en dire un peu plus la dessus sinon je le décrouvrirai très bientôt ^^
Ce que je vais faire, c'est que je vais me documenter dessus, voir comment il marche etc... et je vous tiendrez au courant
Merci beaucoup et à très bientôt :)
Tu pourrais utiliser symfony c'est pratique !!
Allez je balance un défaut de symfony pour un novice :
-le backend est difficilement modifiable pour un novice :S
Sinon c'est du bon boulot !! GG@Potentier
Le backend ? Tu veux dire l'admin generator ?
Oui...
Ce système de cache là je ne trouve pas ça géniale même si la configuration par fichier est pratique...
J'ai rapidement regardé Jelix mais pas en profondeur ^^ je regarde un peu tout, ce qu'il est dit dessus etc..
Parce que bon un framework je veux bien en utiliser un mais si c'est pour me bouffer 85% des ressources non merci autant faire sans ^^
@saturn1 : c'est normal pour le cache puisque les fichiers de l'admin generator sont régénérés à chaque modification dans le fichier generator.yml. Toutefois, l'admin generator ne reste qu'un outil pour faciliter la conception d'interfaces CRUD. Il est efficace pour des besoins simples mais on s'aperçoit qu'il n'est pas forcément productif pour gérer des interfaces d'admin complexes.
@heavenfr : Si tu cherches un bon framework, contente toi de symfony ou de Zend Framework. Les autres ne jouissent pas de tous leurs avantages, leur documentation pléthorique et surtout de leur large communauté de développeurs. La question des performances n'a pas de sens. Symfony est actuellement le framework le "plus lent" mais il tient très bien la charge en environnement critique. Il n'y a qu'à voir les sites comme Dailymotion, Delicious, Yahoo! Bookmarks et Yahoo! Answers qui servent des millions de pages quotidiennement. La prochaine version de Symfony (Symfony 2) qui sortira en 2010 est déjà annoncée comme étant la plus rapide de tous les frameworks existants :)
Pour information, les benchmarks qui ont été faits sur tous les frameworks sont des "hello world". Donc Symfony 1 est le plus lent de tous les frameworks à afficher un "Hello World" mais Symfony 2 sera le plus rapide. Tout ça pour dire que la notion de performances n'a pas de sens car un "Hello World" n'est pas un cas représentatif de performances. En revanche, les montées en charge sur des sites comme Dailymotion, Yahoo! et Delicious sont d'excellents indicateurs pour indiquer si oui ou non un framework est performant.
Et pour finir, le "Hello World" le plus rapide en PHP n'est pas le " echo 'Hello World' " mais le " die('Hello World') " :)
Bonsoir,
En faite je ne vais ni opter pour un framework, ni pour ORM Doctrine. Pourquoi ce choix ? Tout simplement parce que je veux avoir un système indépendant, je ne veux pas qu'il dépende d'autre chose (mis appart pour les requêtes sur la base de donnée : PDO). Je fais aussi ce choix car je veux que le CMS reste le plus simple possible (je le veux destiné aux débutants comme experts en PHP) et aussi car je ne veux pas avoir un système trop lourd côté serveur.
De plus l'utilisation d'un framework ne me permet pas d'avoir la libertée que je peux avoir sans framework (bien que les frameworks soient très puissants !).
J'ai donc opté pour 3 classes principales (si on peut dire ça comme ça ^^) :
- Class db : Etendu de la classe PDO, elle me permet de réaliser des connexions à PDO (quelque soit le type de connexion : mysql, postgresql, sqlite etc...) sans pour autant l'avoir toujours actif. En effet la méthode static getInstance me permet d'obtenir l'instance de PDO que quand elle y est nécessaire. De ce côté un gain de ressources est effectué.
- Class plugins : Cette classe est bien l'une des plus importantes car elle s'occupe de gérer les plugins du CMS (articles, wiki, forum etc...).
- Class droits : Cette classe est quand à elle utilisée pour la gestion des droits dans le CMS. Elle permet donc d'attribuer des actions à tel ou tel membre en fonction de son rang (user, modo, admin par exemple). Il faut cependant que je la développe ^^ elle n'est pas encore prête :p
Vous allez me demander quel est le rapport avec le topic ? C'est tout simple. Je refais actuellement la base de mon CMS et je souhaite proposer un forum en tant que plugin (qui me servira aussi sur mon site ^^). Je venais donc demander des conseilles sur la façon dont je peux coder celui-ci ^^ Or je ne souhaite pas utiliser de framework donc est-ce que la façon que j'ai exposé au premier message est correcte sur la réalisation de celui-ci ?
Voilà j'espère avoir aidé en donnant un peu plus d'informations sur mon projet (projet K.I.S) ^^ et j'espère que vous pourrez m'aider :p
Merci beaucoup et merci de m'avoir déjà proposer des méthodes via un framework ^^
Bonne soirée :)
PS : Plus de framework svp ^^
Salut tout le monde.
Si tu veux que ton site soit le plus indépendant possible, pourquoi ne pas créer ton propre framework ?
C'est ce que je suis entrain de faire pour mes futures sites.
Volontier, cependant cela demande énormément de temps et de courage ^^ or c'est bien ce qu'il me manque un peu :s et puis réaliser ceci tout seul :( ce n'est pas si simple que ça.
Peut-être dans la version 2 ? J'attends un design pour cette version, je pourrai ensuite attaquer les modules (et finir certains ^^).... Et commencer à penser la version 2 ^^
Voilà j'ai 16 ans et je suis intéréssé par ton projet. Si possible on pourrait rester en contact pour s'entraider ou quoique ce soit. Mon adresse e-mail : ***|\**|\**|\***|\***|*
Pas de problème :) je t'ai ajouté sur msn ;)