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 :

Design pattern MVC et mon code actuel


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 17
    Par défaut Design pattern MVC et mon code actuel
    Salut,

    **Désolé je ne savais pas ou poster ce message**

    Je vais vous montrer la hiérarchie de mon code afin de le confronter au design pattern MVC afin de me donner vos remarques pour voir si mon architecture est "viable".Ça ressemble un peu à du MVC.
    Disons que c'est une architecture que j'utilise depuis longtemps et que je trouve très simple (pour moi) donc j'hésite à passer à une conception MVC pure.
    Je l'utilise quand je code en spécifique sinon j'utilise Symfony2 donc ça me change on va dire.

    Supposons je lance "index.php"

    ->Dans le fichier Index j'inclue mon template (canevas.php)(juste un include)

    -> Dans ce canevas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
     
    include($_SERVER['DOCUMENT_ROOT'].'/Php/Configuration.php');
     
    include($_SERVER['DOCUMENT_ROOT'].'/Php/Gestion_controller.php');
     
     ?>
     
    [Mon code html]
     
    <?php (file_exists(TEXTE))?include(TEXTE):0;?>
     
    [Mon code html]
    Dans configuration (une sorte de controleur frontal)
    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
     
    define("TEXTE",$_SERVER['DOCUMENT_ROOT'].'/Txt/'.basename($_SERVER["PHP_SELF"]));
    define("ERROR",'/erreur404.php');
    define("SEARCH",'/recherche.php');
    define("URL",$_SERVER['REQUEST_URI']);
    define("SCRIPT",$_SERVER["PHP_SELF"]);
    define("DOMAINE",$_SERVER['HTTP_HOST']);
    define("IP",$_SERVER["REMOTE_ADDR"]);
    //Chargement des classes
    function chargerClasse ($classe)
    	{ 
    	[Moncode]
    	}
    spl_autoload_register ('chargerClasse');
    session_start();
     
    $menuManager = new MenuManager(Database::getInstance());
    $produitManager = new ProduitManager(Database::getInstance());
    $clientManager = new ClientManager(Database::getInstance());
    $panierManager = new PanierManager(Database::getInstance());
     
    function urlRedirect($menuManager,$produitManager)
    	{
    	$aux=0;
    	if(SCRIPT==GAMME && isset($_GET['id']) && isset($_GET['gammes']))
    		{
    		if(!($aux=$menuManager->get((int)$_GET['id']))) 
    			{ 
    			header("HTTP/1.1 410 Gone"); 
    			echo file_get_contents("http://".DOMAINE.ERROR);
    			}
    		else 
    			{
    			if(current(explode('?', URL, 2))!=($r_url=Menu::verification_menu($aux)))
    				{
    				header('HTTP/1.1 301 Moved Permanently', false, 301);
    				header('Location: http://'.DOMAINE.$r_url.'');
    				}
    			}
    		}
    	else if(SCRIPT==MENU_PRINCIPAL && isset($_GET['id']) && isset($_GET['gammeprincipal']))
    		{
    		if(!($aux=$menuManager->getPrincipal((int)$_GET['id']))) 
    			{ 
    			header("HTTP/1.1 410 Gone"); 
    			echo file_get_contents("http://".DOMAINE.ERROR);
    			}
    		else 
    			if(current(explode('?', URL, 2))!=($r_url=Menu::verification_menu_principal($aux)))
    				{
    				header('HTTP/1.1 301 Moved Permanently', false, 301);
    				header('Location: http://'.DOMAINE.$r_url.'');
    				}
    		}
     
    	if(!$aux)
    		{
    		(!isset($cmsManager))?$cmsManager = new CmsManager(Database::getInstance()):0;
    		$aux=(pathinfo(SCRIPT, PATHINFO_FILENAME)==pathinfo(ERROR, PATHINFO_FILENAME))?$cmsManager->get(pathinfo(SCRIPT, PATHINFO_FILENAME),CmsManager::DYNAMIQUE):$cmsManager->get(pathinfo(parse_url(URL, PHP_URL_PATH), PATHINFO_FILENAME),CmsManager::DYNAMIQUE);
    		}
    	if(!$aux)
    		{
    		header("HTTP/1.1 410 Gone"); 
    		echo file_get_contents("http://".DOMAINE.ERROR);	
    		}
    	return $aux;
    	}
     
    //Cela sert a rediriger vers la bonne page si url comporte erreur, rediriger vers la bonne.
    	$obj=urlRedirect($menuManager,$produitManager);
    Dans Gestion_controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    require_once($_SERVER['DOCUMENT_ROOT'].'/Php/Controller/AjoutProduitController.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/Php/Controller/CreationSuiviCommandeController.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/Php/Controller/ModificationSuiviCommandeController.php');
    ?>
    Exemple d'un "controller"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    //PANIER CODE PROMOTIONNEL
    if(isset($_POST['validation_code_promotion']))
    	{
    	$validated = Gump::is_valid($_POST,array('code_promotion'=>'required|min_len,2'));
    		if($validated === true) 
    			{
    			$ReductionManager = new ReductionManager(Database::getInstance());
    			$_SESSION['reduction']=$ReductionManager->verificationReduction($_POST['code_promotion'],$_SESSION['panier']->totalPanierTTC());
    			}
    	}
    ?>
    Exemple d'une vue
    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
     
    <?php include($_SERVER['DOCUMENT_ROOT'].'/headerslider.php'); ?>
     
    <div id="arborescence"><?php echo Menu::arbre_menu($Cms->texte()); ?></div>
     
    <div class="article">
    	<?php echo $Cms->description_1(); ?>
    </div>
     
    <?php
    if(!$Cms->contact())
    	echo($Cms->description_2())?"<div class=\"article\">".$Cms->description_2()."</div>":"";
    else
    	{
    	include($_SERVER['DOCUMENT_ROOT'].'/formContact.php');
    	echo "<div class=\"article mini_article\">";
    		echo $Cms->description_2();
    	echo "</div>";		
    	}
    ?>

  2. #2
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut
    Citation Envoyé par kyride Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    require_once($_SERVER['DOCUMENT_ROOT'].'/Php/Controller/AjoutProduitController.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/Php/Controller/CreationSuiviCommandeController.php');
    require_once($_SERVER['DOCUMENT_ROOT'].'/Php/Controller/ModificationSuiviCommandeController.php');
    ?>
    Pourquoi fais-tu des require sur l'ensemble de tes contrôleurs alors que tu as défini une fonction d'autoload plus haut ?
    Sinon l'essentiel c'est que ça marche et que ça fasse ce qu'on lui demande, il y a plein de façons de procéder, surtout sur des petits projets.

    Bonne journée à toi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 17
    Par défaut
    Salut,

    Merci de m'avoir donné une réponse.

    Pourquoi fais-tu des require sur l'ensemble de tes contrôleurs alors que tu as défini une fonction d'autoload plus haut ?

    Bah c'est juste que (a ce que j'ai compris sur les autoload) mon ChargerClasse, va chercher une classe
    Si php voit $test = new Menu;
    Et si Menu n'existe pas il va tester ma fonction et aller chercher ma classe si elle existe.


    Mais la pour mes "controlleurs" je vois pas vraiment comment faire ma fonction

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 17
    Par défaut
    En faite je ne vois pas quand la fonction autoload pour mes controllers va être lancé car actuellement je les inclus tous et en fonction de l'url et de l'action de ma page appelante je declenche une action

    Par exemple si je suis sur gamme.php j'Inclue tout mes controllers et si dedans je trouve un script qui vaut gamme.php le contrôle sera effectué en lançant les bons modèles par exemple menumanager.

  5. #5
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut
    Essaye ceci :

    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    spl_autoload_register();
    $menu = new menu\principal;
    tu crée un dossier "menu" à côté de index.php et dedans tu met principal.php

    menu/principal.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php namespace menu;
    class principal
    {
        public function __construct() {
            echo "Hello World";
        }
    }
    puis tu appelle index.php et tu regardes ...

    après tu peux imaginer ce que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $controller = new controleur\principal;
    $model = new modele\bdd;
    $view = new vue\accueil
    C'est déjà un bon point de départ.

    Bonne journée

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 17
    Par défaut
    Je vais voir comment je vais appliquer cela à mon projet mais je ne connaissais pas cette utilisation de l'autoload avec les namespace (pour par contre il faut vraiment respecter namespace et nom du dossier)
    Je ne savais pas que automatiquement sans préciser de fonction dans l'autoload php faisait le chargement auto.

    Franchement merci à toi

    J'ai trouvé d'ailleurs un bon truc la dessus
    http://www.sitepoint.com/autoloading...sr-0-standard/ ou ça explique bien tout ça.

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Tu fais du PHP, pas de l'assembleur. Un conseil, écris un code lisible, sinon dans 6 mois tu perdras beaucoup de temps à te demander ce que fait par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $aux=(pathinfo(SCRIPT, PATHINFO_FILENAME)==pathinfo(ERROR, PATHINFO_FILENAME))?$cmsManager->get(pathinfo(SCRIPT, PATHINFO_FILENAME),CmsManager::DYNAMIQUE):$cmsManager->get(pathinfo(parse_url(URL, PHP_URL_PATH), PATHINFO_FILENAME),CmsManager::DYNAMIQUE);
    Les sauts de ligne et les accolades ne coûtent rien et améliorent la lisibilité.

    Ta configuration fait beaucoup trop de chose. Ne mélange pas dans un seul fichier le code inactif (fonctions, classes) et le code actif (la partie procédurale).

    J'imagine que Database::getInstance() retourne un singleton? Est-ce qu'il y une raison précise pour préférer un singleton, plutôt qu'un objet ordinaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $menuManager->getPrincipal((int)$_GET['id'])
    N'est pas recommandé pour plusieurs raisons:

    - si tu veux contraindre le paramètre à être un entier (ce qui est le cas ici), il vaut mieux mettre la contrainte dans la méthode elle-même. Ça garantit qu'elle est appliquée à chaque fois alors que dans ton cas si jamais tu oublies de caster le paramètre, tu risques d'avoir des résultats imprévisibles.
    Donc fais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function getPrincipal($id)
    {
        $id = (int) $id;
    //reste de code
    }
    - Mais caster n'est pas le bon choix ici. Imagine que $_GET['ID'] ait comme valeur "31test". Le résultat sera $id = 31. Je ne pense pas que ça soit ce que tu cherches. Il vaut mieux vérifier si $_GET['id'] est bien un entier, et le rejeter si ce n'est pas le cas. Plus tu élimines les ambiguités, moins tu auras de comportements inattendus (= bugs).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getPrincipal($id)
    {
        if(!is_numeric($id)) {
            throw new Exception("$id n'est pas un entier!");
        }
     
    //reste du code
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Design pattern MVC référencement
    Par Invité dans le forum Référencement
    Réponses: 1
    Dernier message: 26/06/2013, 10h20
  2. Design pattern MVC et point d'entrée
    Par rgamor dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2012, 17h07
  3. Design Pattern MVC en Java
    Par JCD21 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 02/03/2012, 13h10
  4. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  5. Problème d'accessibilité avec le design patterns MVC
    Par radical_bombtracks dans le forum JSF
    Réponses: 5
    Dernier message: 24/07/2007, 13h15

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