Partage
  • Partager sur Facebook
  • Partager sur Twitter

[TUTO] MVC, bonnes pratiques et site complet !

Espace membres - À venir : livre d'or, news, etc.

7 janvier 2009 à 15:57:25

Bonjour à tous !

Je dédie ce topic à mon big-tuto qui vient de paraître aujourd'hui.
Créez votre site (presque) complet PHP : architecture MVC et bonnes pratiques

Plan du tutoriel

Partie 1 : Introduction : l'avant-tutoriel

1) Avant-propos, comment fonctionne ce tutoriel


  • Introduction, objectifs et pré-requis
  • Organisation du code et des fichiers

2) Bonnes pratiques à appliquer


  • Never Trust User Input
  • L'enfer des guillemets magiques
  • Produire un code lisible et compréhensible

3) Les classes utilisées dans ce tutoriel


  • Accès à la base de données avec PDO2
  • Gestion des formulaires avec la classe Form
  • Lien vers la classe Image (oubli dans le tuto).
Partie 2 : Modules nécessitant un espace membre

1) La base : l'espace membre


  • Objectifs et préparation
  • Inscription
  • Connexion et déconnexion

2) La base (bonus) : le profil


  • [Mini TP] Affichage d'un profil utilisateur
  • Profil utilisateur : modification


Pour les questions, erreurs, modifications à apporter et assimilés, utilisez ce topic ! ;)
Vous pouvez également laisser des messages dans les commentaires de tuto.

Enfin, une question à ceux qui l'auront lu. Pour la suite, vous préférez quoi en premier ?
1) Encore une chapitre sur l'espace membre pour la connexion automatique ;
2) Le TP sur le livre d'or ;
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 janvier 2009 à 18:26:56

Sympa le tuto, le plus dur n'est pas toujours de coder mais d'arriver à bien expliquer... ce que tu as réussi ;)

bravo
  • Partager sur Facebook
  • Partager sur Twitter
7 janvier 2009 à 21:36:49

Pour ma part j'opte pour l'espace membre avec connexion automatique ça vas aider pour la sécurité qui n'est pas toujours bien mise dans la tête des débutants :)
  • Partager sur Facebook
  • Partager sur Twitter
7 janvier 2009 à 22:16:28

Merci, les premiers retour sont très bons, même s'il subsiste quelques problèmes...

La classe Form a été mise à jour suite à un bug.
La classe Image n'est pas disponible dans le tuto : c'est une erreur ! Vous pouvez la trouver ici.


La connexion automatique a effectivement des exigences de sécurité fortes, d'où le besoin d'une sous-partie complète ! (faire des erreurs pour les corriger ;) )
  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2009 à 0:35:27

Bonjour,

Tout d'abord, merci pour ce big tutoriel. Je l'attendais depuis un petit bout de temps, voir comment tu t'y prenais pour coder, etc.. Et c'est vraiment excellent.

J'ai trouvé quelques erreurs :

_ ici, dans le premier code que tu donnes, tu mets ton codes dans une balises html au lieu de php. Rien de grave, c'est juste pour que ça soit mieux.
_ ici, juste au-dessus du deuxième code php, il y a une faute dans la phrase suivante : " Et voilà comment se protéger de cette faille. "
_ ici, tout à la fin de cette partie dans " Les vues associées ", tu dis qu'il faut mettre dans " ~/modeles/membres/vues/ " alors que ça devrait plus tôt être dans " ~/modules/membres/vues/ ". Et pour les deux codes !
_ ici, dans " Les vues associées " pour la connexion, tu mets dans le deuxième encadrée : " ~/modules/membres/connexion_ok.php ", mais ça ne devrait pas plutôt être " ~/modules/membres/vues/connexion_ok.php " ?
_ Dans les pages inscription.php, connexion.phpet modifier_profil.php, ce n'est pas " include chemin_librarie('Form.php'); ", mais " include CHEMIN_LIB.'Form.php'; ", et " include CHEMIN_LIB.'image.php'; " pour seulement modifier_profil.php
_ Ca été dit dans un commentaire, mais il y a aussi une faute dans la page index.php à la racine. Il faut remplacer ça : " $action = (!empty($_GET['action'])) ? $_GET['action.php'].'.php' : 'index.php'; " par " $action = (!empty($_GET['action'])) ? $_GET['action'].'.php' : 'index.php'; "
_ Dans config.php, il y a un petit oubli : " define('CHEMIN_MODELE', 'modeles/'); "

Dans le chapitre sur l'espace membre, au tout début quand tu donnes la bdd, tu dis que c'est intéressant d'utiliser les clés index et uniques. Pour les clés uniques, il n'y a pas besoin d'explication, ça coule de source, mais pas pour les index, même si la doc existe. Je dis ça, mais il se peut que les zéros savent très bien ce que sont les indexs.

Pour la suite, je pense qu'il serait préférable de faire le chapitre sur " l'espace membre pour la connexion automatique ". Ca suivra un peu plus la logique.
  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2009 à 11:59:29

Citation : Jérémy_B

Tout d'abord, merci pour ce big tutoriel. Je l'attendais depuis un petit bout de temps, voir comment tu t'y prenais pour coder, etc.. Et c'est vraiment excellent.


De rien. J'ai du adapter le tutoriel pour qu'il soit plus simple que ce que je fais en vrai. Ca serait vraiment compliqué sinon ! :D
Ceci dit, merci à toi pour les encouragements et toutes les erreurs relevées. La moitié m'avait déjà été rapporté, mais t'as tout synthétisé dans un seul post : pratique pour moi ! ;)

Citation : Mon premier post

Enfin, une question à ceux qui l'auront lu. Pour la suite, vous préférez quoi en premier ?
1) Encore une chapitre sur l'espace membre pour la connexion automatique ;
2) Le TP sur le livre d'or ;

  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2009 à 18:09:29

Comme je l'avais dit dans les commentaires, j'opte pour la connexion automatique et ce avant samedi soir :-°:p
Non plus sérieusement, je pense que la connexion automatique est un point très important ne serait-ce qu'au niveau de la sécurité, et on ne trouve pas de tutoriel sdz qui en parle pour le moment... :(
Or pouvoir poster sur un livre d'or quand on s'est connecté en auto c'est classe ! :lol:

Sinon c'est un boulot superbe et bien pratique ! Je commençais à me mettre à l'organisation de mes fichiers de cette façon et regrettais de ne pas pouvoir faire tout çà en POO, et en plus devoir réadapter tout plus tard à PHP6, je crois que je trouve dans ton tuto toues les infos dont j'ai besoin ;)
[MODE DEVOREUR DE TUTO PHP OFF]
  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2009 à 18:59:39

Citation : Savageman

De rien. J'ai du adapter le tutoriel pour qu'il soit plus simple que ce que je fais en vrai. Ca serait vraiment compliqué sinon ! :D



Une petite question : on peut encore faire plus compliqué ? C'est une question très bête, certe, mais j'ai appris sur ce site les bases en php et j'ai toujours continué à coder seul. Alors, l'organisation des fichiers, la factorisation du code, les bonnes pratiques et les petites astuces.. je les apprend au fur et à mesure en regardant le code des autres. Et là, avec ton tutoriel, j'en apprend encore plus.

Je me doute bien qu'on peut faire encore plus compliquer, mais je ne vois pas quoi. Peux-tu m'en dire deux mots sur le sujet, si tu as le temps, ou prévois-tu dans une partie annexe de dire ce qu'on peut améliorer, etc ?

Citation : Savageman

Ceci dit, merci à toi pour les encouragements et toutes les erreurs relevées. La moitié m'avait déjà été rapporté, mais t'as tout synthétisé dans un seul post : pratique pour moi ! ;)



Il n'y a pas de quoi ! Content d'avoir pu t'aider.
  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2009 à 20:00:49

En fait, on peut surtout faire plus pratique. Avec un autoload(), les classes Form, Pdo2 et Image n'auraient pas besoin d'être incluent : c'est même plus pratique en fait, mais j'avais pas trop envie d'expliquer l'autoload()...

Ensuite, dès qu'on va vouloir changer les CSS, le titre de la page, ajouter des mots-clés, spécifier un comportement pour les moteurs de recherche (index,nofollow par exemple), il y quelque chose à rajouter et qui manque, clairement. Ca n'est vraiment pas très compliqué à mettre en place, car l'architecture que je propose a prévu le coup (les template ~/global/haut.php est affiché après l'éxécution du contrôleur, on peut donc facilement modifier des variables depuis le contrôleur pour influer sur le ~/global/haut.php). En attendant, ça n'est pas fait et c'est un manque.

Pour des raisons de référencement, on peut vouloir rewriter les URL. Apache il est bien gentil, mais le jour où tu veux changer quelques trucs, t'es bien emmerdé. J'ai un petit système perso en PHP pour gérer ça et c'est vraiment bien pratique.

Ca peut ne paraître pas grand chose comme ça, mais en fait c'est plutôt long à expliqer. Si tu sens le besoin d'un truc particulier dans tout ça, fais-moi en part, je pourrais (éventuellement) développer plus le sujet ! ;)
  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2009 à 20:16:16

J'envisageai de faire du Rewrit assez rapidement sur un site que je fais en suivant ton tuto, quel est le problème avec apache et que tu gères avec php ? o_O
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 12:12:51

Bonjour,

Je suis le tuto pas à pas.
C'est un grand changement pour moi, je découvre PDO, l'orienté objet, MVC toussa toussa :D

Je l'ai déjà mis dans les commentaires du tuto mais je le répète ici :
Un tout grand BRAVO et un tout grand MERCI :D
Ce tuto est énormissime et tombe vraiment au bon moment pour moi, encore merci :)


Petite question, je débute le tuto, j'ai donc créé les fichiers haut, bas etc.
Sur la page d'accueil, tout les caractères accentués son remplacés par des �.
C'est pas très joli :/ ( Déjà que avec le CSS fourni... xD (joke) )
J'ai vu dans haut.php un meta pour dire d'utiliser UTF-8.
Est ce lié à ça ? Je dois faire quelque chose de spécial avec mes fichiers ?
J'utilise Notepad++

Merci :)
( Et vivement la suite, je suis impatient :D )
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 12:21:07

@balzard :
http://www.siteduzero.com/tutoriel-3-3 [...] ssements.html

@ALL :
Attention ne pas transformer ce topic en "forum PHP bis"
  • Partager sur Facebook
  • Partager sur Twitter

Si y'a pas d'accents dans mes messages c'est parce que je suis sur un clavier norvegien :)

9 janvier 2009 à 12:28:34

<?php

/**
 * Classe implémentant le singleton pour PDO
 * @author Savageman
 */

class PDO2 extends PDO {

	private static $_instance;

	/* Constructeur : initialisation et appel du constructeur "père" */
	public function __construct( ) {
	
	}
	// End of PDO2::__construct() */

	/* Singleton */
	public static function getInstance() {
	
		if (!isset(self::$_instance)) {
			
			try {
			
				self::$_instance = new PDO(SQL_DSN, SQL_USERNAME, SQL_PASSWORD);
			
			} catch (PDOException $e) {
			
				echo $e;
			}
		} 
		return self::$_instance; 
	}
	// End of PDO2::getInstance() */
}

// end of file */


Pourquoi le constructeur n'est pas privé ? :-°
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 14:05:07

Alors pourquoi, on hérite de PDO si tu l'utilises le singleton de PDO ?

EDIT : Ca fait du 2 en 1 très louche conceptuellement.
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 14:18:40

Question bête concernant MVC:

Imaginons que je souhaite développeur un site contenant plusieurs contrôles (blocs) riches (liste avec possibilité d'ajout d'information par exemple). Certains de ces contrôles peuvent figurer sur plusieurs pages.

Comment en s'appuyant sur MVC, définir la chose ?


Tracker.
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 14:47:15

J'adore :)
Je ne comprends même pas la question.
  • Partager sur Facebook
  • Partager sur Twitter

Si y'a pas d'accents dans mes messages c'est parce que je suis sur un clavier norvegien :)

9 janvier 2009 à 14:50:56

@jordan : Pas faux, je viens de remarquer que sans l'héritage, ça fonctionnerait pareil...

@Tracker : Question pas facile, mais tu peux respecter MVC en l'appliquant. Tu définis des vues globales (équivalentes des partials dans symfony) pour tes listes, et tu les appelles dans tes différents contrôleurs qui en ont besoin (les modèles étant déjà globaux de toutes manières).
[edit] Je sais, ça ne répond pas vraiment à la question, mais je te connais aussi et je sais que tu n'aimes pas spécialement MVC et que tu veux nous faire parler de tes concepts orientés-évènements basés sur des composants (PRADO), donc je ne t'en veut pas ! :D
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 14:52:43

Ah ben j'ai pas compris la réponse non plus :)

Sera-on en mesure de comprendre ce genre de chose quand le tuto sera finit ?
  • Partager sur Facebook
  • Partager sur Twitter

Si y'a pas d'accents dans mes messages c'est parce que je suis sur un clavier norvegien :)

9 janvier 2009 à 15:03:30

Mais en réalité je veux une réponse, car l'enthousiasme béat des gens pour MVC m'allucine. Une application dans 99% des cas est l'assemblage de blocs (blocs ayant un comportement propre == des actions qui lui appartiennent) réutilisés un peu partout dans l'application. C'est d'ailleurs le fondement de toute application informatique utilisant un système de fenêtrage. Suffit de regarder magento, prestashop, facebook etc, pour s'en convaincre.

La question est donc:
"Comment simplement avec MVC (car MVC est bien là pour apporter de la simplicité :-°, non ?) arriver à ce type de développement ?"

Tracker.
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 15:08:59

Bah je dirais qu'un "bloc" comme tu appelles ça est un contrôleur (qui a un comportement propre == des actions qui lui appartiennent). Il suffirait donc d'un méta-contrôleur qui assemble plusieurs "blocs" et ça roule, non ?
Enfin... C'est pas trop le sujet de ce topic : si tu veux débattre, il faut peut-être créer un autre topic ?
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 15:12:08

Tracker on sentait qu'il y avait anguille sous roche dans ta question :D

Néanmoins tu es en train de baisser dans mon estime :
Franchement, ça fait maintenant plus de 6 mois que je te fais chier pour que tu pondes ou que tu contribues à pondre un tuto.

Savageman se bouge, et propose certes de traiter un aspect à la mode (et qui, comme toutes les modes, finira par passer (?)), à savoir le MVC, et là tu démontes le truc.
Moi je dis pourquoi pas, mais tu ne peux pas, avec ton niveau de compétence te contenter de cette posture.
Je pense que tu dois t'engager un peu plus...genre : participer à la rédaction d'un tuto ou de ce tuto ou d'une partie de ce tuto.
  • Partager sur Facebook
  • Partager sur Twitter

Si y'a pas d'accents dans mes messages c'est parce que je suis sur un clavier norvegien :)

9 janvier 2009 à 15:17:03

En utilisant les fonctionnalités du framework ? (j'ai pas lu le tuto, je ne sais pas quoi comment ça tourne)

J'utilise Zend Framework (Magento est développé avec) et il y'a plusieurs fonctionnalités permettant d'appeler des scripts de façon différentes :
  • render : affiche un script sans aucun traitement php
  • partial : affiche un script avec possibilité de passer des paramètres
  • action : appele une action d'un controller ( affiche donc un phtml)


Après il y a des concepts plus poussés comme les layouts et les placeholders, ..
Tout ça pour dire que c'est facilement faisaible.
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 15:27:40

En réalité je suis pas certain d'avoir des réponses, et encore moins qu'MVC en soit une. La question cachait effectivement quelque chose, car je trouve étrange de faire de la fumée autour d'un truc qui parait ne pas apporter de solution au besoin.
Mais en même temps j'apprécierais réellement qu'un d'entre vous démontre l'efficacité de la solution pour des architectures complexes car le besoin se limite rarement à un livre d'or.

@cafeine, parfait, tu vas pouvoir nous faire un exemple concret en utilisant Zend,
ps: Désolé Savageman de polluer ton post.


Tracker.
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 16:41:38

Plop,

C'est à nouveau moi :)
Je suis toujours occupé à lire le tuto :) Je dois parfois relire certains passages pour bien tout comprendre et saisir les finesses de cette nouvelle façon d'organiser son site :)

J'ai relu plusieurs fois la première partie, le concept de Controleur, Modele, Vues, Module, Action etc étant tout à fais nouveau pour moi :)

J'ai fais un petit résumé afin de mieux structurer le fonctionnement de tout ça :)
Qu'en pensez vous ? Ais je bien compris ou bien xD pas du tout :p

Image utilisateur
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 18:00:35

Hum... Bizarre ton schéma...

Ton couple "module/action", on appelle ça un contrôleur.

Le contrôleur créé effectivement le formulaire. C'est discutable, mais j'ai choisis de faire comme ça par simplicité.

Par contre, le contrôleur peut utiliser 0, 1 ou plusieurs modèles, mais ceux-ci ne font pas partie du contrôleur... (donc le rectangle "modèle" ne doit pas être dans le rectangle "module / action"). Il les utilise pour assigner des variables qui porteront les données.

Ta flèche du modèle vers une vue, c'est quoi ça ? Un modèle ne fait jamais appel à une vue...
Le contrôleur sélectionne les vues qui ont besoin d'être affichées.

Ensuite, le index.php affiche toutes les vues sélectionnées avec les données du contrôleur (qui sont de simples variables).
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 janvier 2009 à 20:02:54

Pour utiliser le pattern singleton avec la classe SPDO proprement : http://www.apprendre-php.com/tutoriels [...] rant-pdo.html
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2009 à 20:03:37

En quoi est-ce que le modèle évènementiel et une séparation de type MVC sont incompatible ? :euh:
  • Partager sur Facebook
  • Partager sur Twitter