problème de mvc en php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : problème de mvc en php

par Nagol » 11 févr. 2008, 04:26

mon approche est vouluement réductrice pour améliorer la compréhension :)

prends un gestionnaire d'include et ajoutes lui quelques fonctionalités pour permettre plus de modularités et tu verras qu'on parle de la même chose :) de plus j'attirerais l'attention sur un aspect trés important de l'architecturage des applications: se référer à une méthode (ou pattern) ne doit pas être lu et recraché tel quel mais assimilé et compris au travers de la compréhension de l'architecte. En d'autre terme il est à mon avis malsain de confondre design pattern et norme.

Dans ma compréhension l'idée sous-jacente au MVC est d'overloader le principe de templating en y ajoutant le principe de modularité globale de l'application, ce qui est une très bonne chose dans le cas ou l'on fait un framework destiné à faire de grosses applications ou dans le cas ou l'on fait effectivement une grosse application, il n'est pas nécessaire dans 100% des cas ou un système basique de gestion de template suffit à avoir un résultat global organisé et propre.

My 2c (encore)

par Hywan » 11 févr. 2008, 03:24

Le MVC n'est pas un design pattern. On le confond souvent, mais ce n'en est pas un.
Le MVC est un agrégat de design patterns, et c'est également une philosophie d'architecture d'applications (3 couches : le modèle, le contrôleur, et la vue).

Dans les MVC, tu as des nuances quant à la philosophie utilisée, surtout l'utilisation qu'on fait des couches. Par exemple, la couche modèle peut jouer son rôle de modèle (standard), ou alors être un DataObject comme dans Zend Framework ou Hoa Framework. Un dataObject c'est un objet qui n'a pratiquement aucune fonction, il ne sert qu'à déclarer des paramètres, et il est étendu à un paquetage du framework. Lors de son instanciation, le package va chercher les paramètres (enfants, merci $this) et se configure automatiquement. Les dataObjects peuvent être assimilés à des objets de configurations en quelques sortes, mais on peut leur implémenter certaines méthodes pour améliorer la gestion du package étendu. Un dataObject peut jouer son rôle et celui de modèle (d'où l'avantage).
Le modèle se contente d'arracher les données et de les mettre à disposition. Par exemple, toutes les requêtes SQL, et le traitement de fichiers sont laissés au modèle, ce n'est pas le travail du contrôleur (et encore moins de la vue, on en convient).

Le contrôleur n'est pas un simple gestionnaire d'include. Le contrôleur est situé entre la couche vue et la couche modèle. C'est à travers lui que l'on entre dans le MVC (souvent le Zend_Controller_Front ou Hoa_Controller_Front). Son rôle est bien de dispatcher les tâches (Dispatcher et/ou Router), mais comme il est situé entre les 2 autres couches, il doit faire le lien entre les deux. Il doit donc mettre en route les bons modèles, leurs assigner des tâches, récupérer les valeurs (ou recevoir, ça dépend de la philosophie adoptée), et les redistribuer dans la couche vue. C'est une sorte de plaque tournante, de pivot.

Le MVC de Hoa est un peu particulier. Il a un peu la même philosophie que celui de Zend je crois. Comme les modèles sont des dataObjects, on a plusieurs catégorie de contrôleurs (je ne sais plus si c'est comme ça dans ZF en revanche). Dans Hoa, on a le Controler_Front qui va lancer les contrôleurs primaires et secondaires. Les contrôleurs secondaires étant un soutien aux contrôleurs primaires (pour ne pas les surcharger). Chacun des contrôleurs primaires et secondaires étendent le Controller_Dispatcher_Action, ce qui leur donne une plus grande capacité et de de liberté dans le traitement des tâches. En effet, on est capable de stocker des données temporairement en attendant un prochain contrôleur qui va les reprendre et les réutiliser. Je ne m'avance pas plus, ça devient technique.
La couche Controller permet également l'assignement des variables pour la couche Vue.
Le controller, une fois tout le travail effectué, est capable de reconstituer toutes les données et de les afficher (dans un ordre naturel et/ou défini par les contrôleurs et modèles, ça dépend du MVC). C'est le rôle de Hoa_Controller_Response (pareil pour ZF il me semble, me souviens plus, à moins que ce soit dans SF ...).
Un contrôleur permet également l'intervention de plugin à divers endroits de la machine MVC. Tu as plus d'emprise sur les données.

Bref, le contrôleur est l'élément principal du MVC. Il est le pivot entre le modèle et la vue. Il défini les tâches, les regroupe, les redistribue, les assigne, mais ne les manipule pas (ce rôle étant pour le modèle — ou contrôleur primaire et secondaire ça dépend de la terminologie et philosophie adoptée). C'est donc bien plus qu'un gestionnaire d'include ;-).

La vue quant à elle, n'a rien à faire. Elle se prépare (via le Controller généralement), et se laisse assigner des valeurs. Après, tous les délires sont possibles sur la couche Vue pour faciliter les sorties : template ou pas par exemple.

Voilà, c'était un tout tout petit cours sur les MVC ;-).

Retiens que beaucoup de MVC se ressemblent dans les grandes lignes. Ce qui fait la force des divers MVC c'est leur facilité à se mettre en place. Quand il faut 50 fichiers pour afficher un « Hello World ! » c'est grave. Il faut qu'il soit léger, et rapide, mais puissant. Par exemple, je sais que celui de ZF posait (c'est peut être réparé) des problèmes quand on voulait faire des sous-modules dans des modules. Dans Hoa j'ai comblé se problème en ajoutant la possibilité d'exécuter des contrôleurs en boucle selon un ordre précis. Ils peuvent déposer des données pour le suivant etc. Comme si on effectuait un travail d'affinage. Comme je l'ai dis, il y a plein de solutions possibles, les MVC peuvent en adopter plusieurs (comme Zend ou Hoa). À toi de faire ton choix :).

Sur ce, bonne nuit !

par Nagol » 11 févr. 2008, 02:13

hmm le contrôlleur devrait se borner à dispatcher des url pour permettre à l'application finale d'être modulaire.

index.php?module=front&page=index -> pour le modèle se trouvant dans /module/front/index.php
index.php?module=forum&page=topic&id=36052 -> pour le modèle /module/forum/topic.php?id=36052

le code permettant de passer de l'un à l'autre c'est juste ça un contrôlleur: un gestionnaire d'include

my 2c

par Genova » 11 févr. 2008, 01:36

C'est pas vraiment une question d'exemples ou pas, MVC c'est un design pattern, une façon de concevoir et d'organiser son code selon les modèles / vues et contrôleur.

Là tu vois bien que dans ce que tu appels ton contrôleur, tu fais tout le boulot du modèle (requêtes SQL), et en plus même parfois une vue puisque tu sembles afficher les données d'une table.

Donc à mon avis tu n'as pas tout à fait suivi la structure du modèle MVC, mais bon ce design pattern n'est pas indispensable non plus tu peux faire sans ;)

par x@v » 11 févr. 2008, 01:31

je devrai faire une class pour le modèle, mais bon...
Le soucis c'est que je n'est que la session comme portée.
Et puis les exemples on en vois pas beaucoups, voir aucun en php...
c'est juste une ébauche mon code...

par Berzemus » 10 févr. 2008, 21:26

mvc est plutôt une (bonne) manière de structurer son code, on fait ce qu'on veut après.

Mais, arrêtez-moi si je me trompe, mais a lire le code que tu as fourni, je vois plutôt de la logique applicative qui doit se retrouver dans le model, et de l'affichage qui doit se retrouver dans le view.. et le controller, il m'a l'air un caché la dedans..

ah: grillé par momox..

par momox » 10 févr. 2008, 21:12

Aïe... Un controlleur selon le modéle MVC ce n'est pas du tout ca...
Lc ontrolleur gére l'interation entre la vue et le modéle, il ne sait pas comment afficher les données, ni comment les récuperer.

par x@v » 10 févr. 2008, 19:05

Surrement, mais c'est surement la même chose, que de faire ça soit même ?
Exemple avec mon contrôleur sachant quil va être deux fois plus grands.
En J2EE avec Servlet et javaBean j'ai fait une appli avec un contrôleur de 1200 lignes (mal codés).
Et sa ne gène pas.
Est ce qu'un contrôleur de cette taille est valable en php ?
Merci
<?php			###################################CONNEXION##############
require ("inc_connexion.php");
$article = $_REQUEST['article'];
$mailF = addslashes($_REQUEST['mailF']);
$time = time();
$dateInsertion=time();
$mailH = addslashes($_REQUEST['mailH']);
$nomEntreprise = addslashes($_REQUEST['nomEntreprise']);
$nomF = addslashes($_REQUEST['nomF']);
$nomH = addslashes($_REQUEST['nomH']);
$prenomF = addslashes($_REQUEST['prenomF']);
$prenomH = addslashes($_REQUEST['prenomH']);
$marie = addslashes($_REQUEST['marie']);
$commentaire = addslashes($_REQUEST['commentaire']);
$adresse = addslashes($_REQUEST['adresse']);
$codePostal = addslashes($_REQUEST['codePostal']);
$ville = addslashes($_REQUEST['ville']);
$telDomicile = addslashes($_REQUEST['telDomicile']);
$telPortable = addslashes($_REQUEST['telPortable']);
$telBureau = addslashes($_REQUEST['telBureau']);
$gardeF = addslashes($_REQUEST['gardeF']);
$gardeH = addslashes($_REQUEST['gardeH']);
$dateNaissanceF = addslashes($_REQUEST['dateNaissanceF']);
$dateNaissanceH = addslashes($_REQUEST['dateNaissanceH']);
$nombreEnfantH = addslashes($_REQUEST['nombreEnfantH']);
$nombreEnfantF = addslashes($_REQUEST['nombreEnfantF']);
$proffessionF = addslashes($_REQUEST['proffessionF']);
$proffessionH = addslashes($_REQUEST['proffessionH']);
$anglais = addslashes($_REQUEST['anglais']);
$espagnol = addslashes($_REQUEST['espagnol']);
$allemand = addslashes($_REQUEST['allemand']);
$chinois = addslashes($_REQUEST['chinois']);
$italien = addslashes($_REQUEST['italien']);
$autres = addslashes($_REQUEST['autres']);
$niveauEtudeF = addslashes($_REQUEST['niveauEtudeF']);
$niveauEtudeH = addslashes($_REQUEST['niveauEtudeH']);
$auteur = addslashes($_REQUEST['auteur']);
$compositeur = addslashes($_REQUEST['compositeur']);
$chanteur = addslashes($_REQUEST['chanteur']);
$arrangeur = addslashes($_REQUEST['arrangeur']);
$batteur = addslashes($_REQUEST['batteur']);
$guitariste = addslashes($_REQUEST['guitariste']);
$bassiste = addslashes($_REQUEST['bassiste']);
$pianniste = addslashes($_REQUEST['pianniste']);
$violoniste = addslashes($_REQUEST['violoniste']);
$trombonne = addslashes($_REQUEST['trombonne']);
$saxophoniste = addslashes($_REQUEST['saxophoniste']);
$trompette = addslashes($_REQUEST['trompette']);
$dateInsertion = addslashes($_REQUEST['dateInsertion']);
$idPersonne=$_REQUEST['idPersonne'];
//echo 'ddddddddddddddddddddddddd :: '.$_REQUEST['article'];
	/*echo $article.'fffff<br>';
	echo $nomH.'fffff<br>';
	echo $nombreEnfantH.'fffff<br>';*/

if (isset($_POST['article']) && $_REQUEST['article'] != '')
{  
	######################## Modification d'un article ########################
	$query = "UPDATE personne SET idPersonne=$article, mailF='$mailF', mailH='$mailH', 
	nomEntreprise='$nomEntreprise', nomF='$nomF', nomH='$nomH', prenomF='$prenomF', prenomH='$prenomH', 
	marie='$marie', commentaire='$commentaire', adresse='$adresse', codePostal='$codePostal', 
	ville='$ville', telDomicile='$telDomicile', telPortable='$telPortable', telBureau='$telBureau', 
	gardeF='$gardeF', gardeH='$gardeH', dateNaissanceF='$dateNaissanceF', 
	dateNaissanceH='$dateNaissanceH', nombreEnfantH='$nombreEnfantH', nombreEnfantF='$nombreEnfantF', 
	proffessionF='$proffessionF', proffessionH='$proffessionH', anglais='$anglais', 
	espagnol='$espagnol', allemand='$allemand', chinois='$chinois', italien='$italien', 
	autres='$autres', niveauEtudeF='$niveauEtudeF', niveauEtudeH='$niveauEtudeH', auteur='$auteur', 
	compositeur='$compositeur', chanteur='$chanteur', arrangeur='$arrangeur', batteur='$batteur', 
	guitariste='$guitariste', bassiste='$bassiste', pianniste='$pianniste', violoniste='$violoniste', 
	trombonne='$trombonne', saxophoniste='$saxophoniste', trompette='$trompette', 
	dateInsertion='', modifier='$time' where idPersonne=$article";
	
	$result=mysql_query($query, $lien) or die (mysql_error());
		
	if (!$result)
	{
	echo 'Il y a une erreur à l\'execution de cette requete de mis à jour table "Personne" : <pre>'.$query.'</pre>';
	echo mysql_error($lien).'<br>';
	}
}
else if(isset($_POST['motsCles']) || !empty($_POST['motsCles']))
{
	$motsCles=$_POST['motsCles'];
	// chaine à rechercher dans la base
	//You could also write a form where the keywords could be entered.	
	$association = 'AND';
	//Search mode AND or OR, can also be defined e.g. by RADIO-buttons.
	$motsCles = explode(" ",$motsCles);
	// on crée un tableau avec la chaine insérer
	//We must participate the keywords because we want later create a mysql query with them.
	$query = array();
	// création d'un tableau vide
	foreach($motsCles as $motsCles) {
	$query[] = "( nomF LIKE '%".$motsCles."%'
	OR nomH LIKE '%".$motsCles."%'
	OR prenomH LIKE '%".$motsCles."%'
	OR prenomF LIKE '%".$motsCles."%'
	OR ville LIKE '%".$motsCles."%'
	OR proffessionF LIKE '%".$motsCles."%'
	OR proffessionH LIKE '%".$motsCles."%'
	OR nomEntreprise LIKE '%".$motsCles."%')";
	}
	// on liste le tableau $keywords[] dans une requête qu'on insère dans le tableau vide $query[]
	$query = implode(" ",$query);
	//Now we have to put the keywords together again by using the AND or the OR-association.
	$sql = "SELECT * FROM personne WHERE $query";
	$res = mysql_query($sql);
	if (!$res) 
	{
		print '<pre>'.$sql.'</pre>';
		/**
		* E_USER_ERROR will exit the script.
		* E_USER_NOTICE and E_USER_WARNING won't stop the script.
		*/
		trigger_error('Database query failed: '.mysql_error(), E_USER_ERROR);
	} 
	else 
	{
		while ($row = mysql_fetch_object($res)) 
		{
		echo $row->idPersonne.'<br />';
		echo $row->nomH.'<br />';
		echo $row->nomF.'<br />';
		echo $row->prenomH.'<br />';
		echo $row->prenomF.'<br />';
		echo $row->proffessionF.'<br />';
		echo $row->proffessionH.'<br />';
		echo $row->nomEntreprise.'<br />';
		exit;
		}
		if(mysql_num_rows($res) == '')
		{
		echo 'aucun résultat';
		print '<pre>'.$sql.'</pre>';
		// Add here the routines to print the results.
		exit;
		}
	}
	//...and at last, of course, we'll send the mysql - query and you could print the results as usual with mysql_fetch_object() or mysql_fetch_array()...
}
else if(!isset($_POST['motsCles']) || empty($_POST['motsCles']))
{
	header('Location: '.$_POST['HTTP_REFERER']);
	exit();
}
else 
{
	########### SI c'est un nouvel article ##########
	$query = "insert into personne values
	( '$article', '$mailF', '$mailH', '$nomEntreprise', '$nomF', '$nomH', '$prenomF', '$prenomH', 
	'$marie', '$commentaire', '$adresse', '$codePostal', 
	'$ville', '$telDomicile', '$telPortable', '$telBureau', 
	'$gardeF', '$gardeH', '$dateNaissanceF', 
	'$dateNaissanceH', '$nombreEnfantH', '$nombreEnfantF', 
	'$proffessionF', '$proffessionH', '$anglais', 
	'$espagnol', '$allemand', '$chinois', '$italien', 
	'$autres', '$niveauEtudeF', '$niveauEtudeH', '$auteur', 
	'$compositeur', '$chanteur', '$arrangeur', '$batteur', 
	'$guitariste', '$bassiste', '$pianniste', '$violoniste', 
	'$trombonne', '$saxophoniste', '$trompette', 
	'$time', '');";

	$result=mysql_query($query, $lien) or die (mysql_error());
	//$id_article = mysql_insert_id();
	//echo $dernier_id;
	if (!$result) 
	{
	echo 'Il y a une erreur à l\'execution de cette requete : <pre>'.$query.'</pre>'.mysql_error();
	echo 'Vous devez prévenir l\'administrateur';
	@mail($mail, $_SERVER['HTTP_HOST'].':: erreur de requette', 'L\'équipe '.$_SERVER['HTTP_REFERER'].$_SERVER['HTTP_HOST'].' vous remercie Et vous envoie cet email vous prévenant d\'une requette mal insérer de la page "article envoyé"');
	exit;
	}
}
header('Location: '.$_POST['destination']);
?>

par Cyrano » 10 févr. 2008, 18:36

Tu devrais peut-être t'inspirer de méthodes existantes en fouillant le code du Zend Framework par exemple ou encore du Framework Hoa.

problème de mvc en php

par x@v » 10 févr. 2008, 18:17

Bonjour,
je souhaite développer une application en mvc et ce qui me pose comme réflexion c'est la taille du contrôleur, qui devient conséquente et à vu de nez va faire 800 lignes.
En J2EE sa ne pose pas de problème, mais en php je n'ai aucun recule avec ce pattern ?
Merci