IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] [Architecture]... d'un site en php-objet ?


Sujet :

Langage PHP

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [POO] [Architecture]... d'un site en php-objet ?
    Bonjour tout le monde,

    je me lance dans un nouveau site en php, et cette fois j'aimerais bien utiliser l'orienté objet...

    mon plus gros problème consiste en la mise en place d'une architecture viable et si possible standard... en gros, comment structurer son site php ? Y a-t-il des design patterns "à la mode" - comme en java, un pattern MVC Model - View - Controller ?

    Où est-ce que je pourrais trouver de la documentation sur le sujet ? je n'ai pas envie de repartir dans une architecture bancale, faite d'un mélange constant de php, html, css, js, ....
    Même si le site ne sera pas trop important, il devra quand même être dynamique, gérer le multilinguisme, être facilement "skinnable", etc....

    Merci des conseils
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Justement, je n'aurais pas appelé "bancale" la méthode qui consiste à déléguer à chaque technologie ce qui lui convient. C'est une méthode d'abstraction, ce qui correspond tout à fait à la POO à mon avis.

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    bah pour moi, je trouve que les liens entre les différentes facettes d'un projet de site web sont entremelées tout au long du code.... je voudrais obtenir une séparation nette, et ne pas mettre de code métier (sql, boucles, ...) juste à côté du code graphique de mise en page....

    pour cela, il n'y a pas de pattern normalisé ? au moins des conseils.... pour partir sur quelque chose de robuste...

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Peut-être en utilisant des templates ... ?

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Je viens de tomber la dessus:
    ftp://ftp-developpez.com/tahe/fichiers-archive/progwebphpmvc-250305.pdf

    c'est un bon début

    par contre y'a noté que php 4 n'est pas OO ????
    sur ma distrib 4.4.2 en tout cas ça à l'air de l'être....
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  6. #6
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 208
    Points : 218
    Points
    218
    Par défaut
    Bien le Bonjour ami de la structuration en couche:

    Voilà comment je fais pour le moment:

    * un repertoire style pour le CSS
    * un repertoire ihms ou je mets toutes les classes PHP qui produisent un resultat en XHTML (methode abstraite __toString() possible)
    * un repertoire classes ou je met toutes les autres classes PHP qui ne produise rien de graphique. On peut distinguer les classes qui sont construites à partir de la base de données. Ainsi ai-je créé une classe abstraite Conservable où je factorise les attributs de clé primaire, manager d'erreur pour l'instance fille, methodes de sauvegarde, destruction et update... etc
    * a la racine du repertoire je met l'index et les scripts de controle:
    Un script de controle gere les evenements en construisant les bons objets et en appelant les bonnes ihms. On peut faire casiment un script de controle par ihm a base de formulaires.
    * j'ai aussi un script w3c.php qui me donne tete et pied de page en XHTML (appel des feuilles de styles, meta informations et Dublin Core).

    Rien n'est parfait mais c'est tres propre. Je ne suis pas du tout sur d'avoir besoin d'un framework même perso...

  7. #7
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Citation Envoyé par chat hotplug
    * a la racine du repertoire je met l'index et les scripts de controle:
    Peux tu donner un exemple de script de contrôle ? ça m'intéresse
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    je dois dire que je ne vois pas très bien comment structurer le controlleur...

    autre question: tu as parlé de la méthode __toString, mais je n'arrive pas à l'utiliser... ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Foo {
      var $var;
      function Foo($v='toto') {
        $this->$var = $v;
      }
     
      function __toString(){
        return $this->$var;
      }
    }
    ...
     
    echo new Foo();
    m'écrit "Object" ?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    Alors, php4 est objet mais juste pour dire qu'il l'est
    Le vrai modèle objet en php c est a partir de php5.

    Pour faire une appli php en mvc, j'utilise smarty qui me permet de faire mes vues.
    Ensuite, j'ai un "controlleur" par module et des objets métiers en plus d'autres classes qui font mon framework.

    Mon architecture :
    /
    /config
    /framework
    /modules
    /style
    /tools
    index.php
    j'ai un index par module qui appel la methode correspondante du controlleur en fonction d'un argument passé dans l'url

    mes templates sont dans les modules concernés.

    Dans tools, j'ai smarty et d'autres outils tiers comme jpgraph

    Pour __tostring : http://fr.php.net/manual/it/language.oop5.magic.php
    c'est du php 5
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  10. #10
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par siddh
    Alors, php4 est objet mais juste pour dire qu'il l'est
    Le vrai modèle objet en php c est a partir de php5.
    c'est bien ma veine.... je vais essayer de motiver mon hébergeur à se mettre à jour, mais ça m'étonnerait que je puisse passer en version 5

    merci pour les conseils
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    sa se trouve ton hebergeur fait tourner les deux

  12. #12
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 208
    Points : 218
    Points
    218
    Par défaut
    Re bonjour,

    __toString c'est une méthode abstraite perso...

    exemple d'un script de controle (pour une liste de selection avec operation delete edit et add):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    ?php
     
    require_once($_SERVER['DOCUMENT_ROOT'].'/w3c.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/classes/stationService.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/ihms/stationsIHM.php');
     
    session_start();
     
    if( isset($_GET['station']) ){
    	header("Location: http://".$_SERVER['SERVER_NAME']."/admin_station.php?station=".$_GET['station']);	
    }
    if( isset($_POST['add']) ){
    	header("Location: http://".$_SERVER['SERVER_NAME']."/admin_station.php");
    }
     
    setHead();
    setMenuAdmin();
     
    if( isset($_POST['del']) ){
    	foreach( $_POST['stations'] as $del_pk){
    		$s = new StationService();
    		$s->load($del_pk);
    		$s->erase();
    	}
    }
     
    // graphisme
     
    if( isset($_POST['next']) ) $_SESSION['ihm']->nextPage();
    elseif( isset($_POST['previous']) ) $_SESSION['ihm']->previousPage();
    else $_SESSION['ihm'] = new StationsIHM(5);
    echo $_SESSION['ihm']->__toString();
     
    setFoot();
     
    ?>
    autre script pour l'edition d'une station service:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    <?php
     
    /*
     * CSS
     * class p.msg_confirm 
     */
     
    require_once($_SERVER['DOCUMENT_ROOT'].'/w3c.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/classes/adresse.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/classes/carburant.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/classes/compagniePetroliere.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/classes/tarif.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/classes/stationService.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/ihms/stationIHM.php');
     
    session_start();
     
    if( !isset($_SESSION['st']) || !isset($_GET['station']) ) $_SESSION['st'] = new StationService(); 
    if( isset($_GET['station']) ){
    	$_SESSION['st']->load($_GET['station']);
    	$_SESSION['st']->loadTarifs();
    }
     
    $erreurs = '';
    $messages = '';
     
    if( isset($_POST['add']) || isset($_POST['up_'.$_SESSION['st']->getId()]) ){
    	// affectation des champs de formulaire a l'objet en session	
    	$co = new CompagniePetroliere();
    	$co->load($_POST['compagniePetroliere']);
    	$_SESSION['st']->setCompagniePetroliere($co);
    	$adr = new Adresse();
    	if( !isset($_POST['add']) ) $adr->load($_SESSION['st']->getAdresse()->getId());
    	$adr->setVoie($_POST['voie']);
    	$adr->setVille($_POST['ville']);
    	$adr->setCodePostal($_POST['codePostal']);
    	$_SESSION['st']->setAdresse($adr);
    	// variables utiles
    	$carburant;
    	$tarif;
    	// modifications de tarifs
    	foreach( $_POST as $key => $val ){
    		list($prefix, $id) = explode('_', $key);
    		switch($prefix){			
    			case 'newcarburant':
    				$carburant = new Carburant();
    				$carburant->load($val);
    				$tarif = new Tarif();				
    				$tarif->setCarburant($carburant);			
    				break;
    			case 'newprix':
    				$tarif->setPrix($val);
    				if( $tarif->getCarburant()->getId() != 0 ) $_SESSION['st']->setTarif($tarif);
    				break;
    			case 'prix':
    				$tarif = new Tarif();
    				$tarif->load($id);
    				$tarif->setPrix($val);
    				$_SESSION['st']->setTarif($tarif);
    				break;
    		}
    	}
    	if( isset($_POST['delTarifs']) ){
    		foreach( $_POST['delTarifs'] as $delIndex ){
    			$_SESSION['st']->unsetTarif($delIndex);
    		}	
    	}
    	// vérification avant sauvegarde	
    	if( $_SESSION['st']->check() ){
    		// sauvegarde: insert ou update
    		$_SESSION['st']->save();
    		// message de confirmation
    		$messages = '<p class="msg_confirm">Station service enregistr&eacute;e avec succès.</p>';
    		// préparation d'un nouvel ajout de station
    		if( isset($_POST['add']) ) $_SESSION['st'] = new StationService();
    		// préparation d'un nouvel ajout de station et redirection
    		// en effet si on a supprimé tous les tarifs il n'y a plus de station service
    		if( !isset($_POST['add']) && $_SESSION['st']->exists() == false ){
    			$_SESSION['st'] = new StationService();
    			// redirection sur la page des stations
    			header("Location: http://".$_SERVER['SERVER_NAME']."/admin_stations.php");				
    		}
    		// sinon rien: on reste fixé sur la même station 
    	}
    	// echec vérification
    	else{
    		$erreurs = $_SESSION['st']->getEm()->afficher();
    	}
    }
    elseif( isset($_POST['del']) ){
    	// suppression
    	$_SESSION['st']->erase();
    	// redirection sur la page des stations
    	header("Location: http://".$_SERVER['SERVER_NAME']."/admin_stations.php");	
    }
     
    // graphisme
     
    setHead();
    setMenuAdmin();
     
    $ihm = new stationIHM($_SESSION['st']);
    echo $ihm->__toString();
    echo $erreurs;
    echo $messages;
     
    setFoot();
     
    ?>

  13. #13
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Chez moi j'utilise un MVC Maison.

    mais les principes sont simples
    les éléments manipulé sont tous définis par des classes
    l'utilisateur peut effectuer des actions sur les objets "éditer la liste des produits" ces action sont représentés par des ensembles d'actions élémentaires définies dans des classe d'action.
    l'interface utilisateur est généré par des templates.

    un acte utilisateur est une succéssion d'action qui agit sur les éléments et décrit quoi afficher (ça ne dit pas comment c'est juste une liste d'objet)

    pour relier tout ça j'ai une seul page php qui instancie l'action demandé et assure l'anchainement.
    cela représente 5*570 octets

    à aucun moment une action ne voit une quelconque base de donnée. elle ne manipule que des objets.

    si un objet doit être extrait ou enregistré dans une source de donnée c'est à sa classe den assurer la fonction. soit directement soit par héritage.

    mes objets encapsule toute la partie coeur de l'application.
    mes action ne décrivent que la logique de l'application
    mes templates ne décrives que la façon dont serront présenté les éléments.

    j'ai deux paramêtre que je passe à mon contrôleur pour lui dire quelle action effectuer un notion de verbe sujet
    afficherFrom Utilisateur; Enregistrer Facture
    ces deux paramêtre détermine la méthode et la classe d'action.
    une fois l'action élémentaire exécutée soit elle produit une nouvelle action soit un affichage.
    une nouvelle action donne lieu à une redirection (on reboucle)
    un affichage lance le moteur de template.

    A+JYT

  14. #14
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 208
    Points : 218
    Points
    218
    Par défaut
    Après reflexion je vois que ma methode gagnerai en généricité avec un petit framework perso. Il y a un tutorial a ce sujet sur ce site avec le code expliqué.

Discussions similaires

  1. [POO] Site web et PHP objet
    Par alband85 dans le forum Langage
    Réponses: 6
    Dernier message: 13/05/2009, 15h41
  2. [POO] conseils pour creation site en PHP Objet
    Par Clorish dans le forum Langage
    Réponses: 8
    Dernier message: 05/06/2008, 23h18
  3. [POO] Évolution d'un site - passage à PHP 5
    Par filipic dans le forum Langage
    Réponses: 7
    Dernier message: 05/02/2007, 14h24
  4. [POO] Quelle archi pour une webapp PHP objet ?
    Par yann2 dans le forum Langage
    Réponses: 6
    Dernier message: 09/06/2006, 11h10
  5. [POO] PB d'interprétation des '\n' (PHP Objet)
    Par Bobabar dans le forum Langage
    Réponses: 8
    Dernier message: 25/04/2006, 01h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo