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 :

Conversion -> MVC


Sujet :

Langage PHP

  1. #1
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Conversion -> MVC
    J'ai entrepris la conversion de mon skeleton de transaction vers le modèle MVC tant décrié par de nombreux modérateurs de ce site.
    Il y a 2 tutos disponibles et j'ai choisi le second car a une approche objet quitte à s'inspirer plus tard du 1er....

    Mais j'ai d'abord des erreurs de parsing à solutionner.

    Voici mon index.php

    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test MVC</title>
    </head>
    
    <body>
    
    <?php
    echo "test MVC" ;
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/controller.php") ;
    
    	$front = Controller::getInstance()->dispatch();
    
    	public function launch(Request $request, Response $response)
    ==>17	{	$variable = 'essai de variable';
    		$response->addVar('unevariable',$variable);
    		$this->render(dirname(__FILE__).'/show.php');
    		$this->printOut();
    	}
    
    echo " successfully" ;
    ?>
    </body>
    </html>
    Et j'ai une erreur que voici;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Parse error:  syntax error, unexpected T_PUBLIC in F:\WebSites\mvc\index.php on line 17
    Voici le controller.php

    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
    <?php
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/class/request.php") ; 
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/class/response.php") ; 
     
    class Controller
    {	private $_defaults = array('module' => 'index', 'action' => 'index');
    	private $_request;
    	private $_response;
    	private static $_instance = null;
     
    	private function __construct()
    	{
    		$this->_request  = new Request();
    		$this->_response = new Response();
    	}
     
    	public static function getInstance()
    	{	if (is_null(self::$_instance))
    			self::$_instance = new self();
    		return self::$_instance;
    	}
     
    	public function dispatch($defaults = null)
    	{	$parsed = $this->_request->route();
    		$parsed = array_merge($this->_defaults, $parsed);
    		$this->forward($parsed['module'], $parsed['action']);
    	}
     
    	public function forward($module, $action)
    	{	$command = $this->_getCommand($module, $action);
    		$command->launch($this->_request, $this->_response);
    	}
     
    	private function _getCommand($module, $action)
    	{	if (!file_exists($path = "$module/$action.php")) 
    			throw new Exception("Commande inconnue $module/$action.php");
     
     		require($path);
    		$class = $action.'Action';
    		return new $class($this);
    	}
     
    	public function getResponse()
    	{
    		return $this->_response;
    	}
     
    	public function redirect($url)
    	{
    		$this->_response->redirect($url);
    	}
     
    	public function render($file)
    	{
    		$view = new View();
    		$this->_response->setBody($view->render($file,$this->_response->getVars()));
    	}
    }
    Le code request et response.php
    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
    <?php
    class Request {
     
        protected $_request_parameters;
     
        protected $_browser_capabilities;
     
        public function __construct () {
            $this->_request_parameters = $_REQUEST;
     
            $this->_browser_capabilities = get_browser($_SERVER['HTTP_USER_AGENT']);
        }
     
        public function __get ($key) {
            return isset($this->_request_parameters[$key]) ? $this->_request_parameters[$key] : null;
        }
     
        public function __set ($key, $value) {
            $this->_request_parameters[$key] = $value;
        }
     
        public function getRequestParameters () {
            return $this->_request_parameters;
        }
     
        public function addAll ($collection = array()) {
            if (!empty($collection))
                $this->_request_parameters = array_merge($this->_request_parameters, (array)$collection);
        }
     
        public function getBrowserCapabilities() {
            return $this->_browser_capabilities;
        }
    }
    ?>
    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
    <?php
    abstract class Action
    {
    	protected $_controller;
    	public function __construct($controller)
    	{
    		$this->_controller = $controller;
    	}
     
    	abstract public function launch(Request $request, Response $response);
     
    	public function render($file)
    	{
    		$this->_controller->render($file);
    	}
     
    	public function printOut()
    	{
    		$this->_controller->getResponse()->printOut();
    	}
     
    	protected function _forward($module, $action)
    	{
    		$this->_controller->forward($module, $action);
    	}
     
    	protected function _redirect($url)
    	{
    		$this->_controller->redirect($url);
    	}
    }
    ?>
    Le code view.php

    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
    class View
    {
    	public function render($file, $assigns = array())
    	{
    		extract($assigns);
    		ob_start();
    		require($file);
    		$str = ob_get_contents();
    		ob_end_clean();
    		return $str;
    	}
    }
    ?>
    Tous ces codes ont été copiés/collés du document source.
    Raison aussi pour laquelle je ne comprends pas mon erreur !

    Merci à ceussss qui me donneront un coup de main

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    l'erreur est assez parlante
    Tu mets un public dans ta signature :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function launch(Request $request, Response $response)
    alors que tu n'es pas dans une classe. Sinon ta définition de fonction en plein milieu du code, c'est pas très clean

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ton problème ne se situe pas à la ligne #17 mais à la ligne #16. Tu n'est pas dans une classe à cet endroit.

    Par ailleurs, je comprends pas bien pour quelle obscure raison t'as été mettre ça là ? ça ressemble à un copier-coller mal compris.

  4. #4
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Modèle MVC
    Benjamin,

    Je ne vais pas discuter sur la façon de faire un copier-coller !

    Mais content de te voir "accrocher" à mon problème puisque tu avais toi-même suggéré cette migration !
    Mon 1er souci est d'afficher une page simple d'accueil avec juste un bouton 'Bienvenue' et là dans le pdf mentionné, je suis déjà paumé !
    Et je pigerais avec la pratique, ne t'en fait pas pour moi !

    Ne trouvant pas répondre à mon problème, je suis passé au 2 ième niveau de complexité du document en repérant les endroits (et il y en a bcp car des "headers" font mauvais ménage avec de l'html)....
    Non, ce n'est pas du bête copier-coller !

    A défaut d'exemple (comme dans le 1er pfd, + gros) je ne vois pas la logique du système MVC ! mais je n'ai pas percuté à part le principe de séparation que je crois avoir +/- adopté dans mon propre skeleton mais cela devenait "fouillis" a défaut d'être structuré !

    Je n'ai vu nulle part, je n'ai pas dit que cela n'y figurait pas mais je n'ai pas percuté ! ..... la façon de piloter tes transactions, je me doute que c'est via l'URL mais un exemple aurait été le bienvenu pour les ex-comateux comme moi !

    Donc mes modules sont maintenant

    index.php
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test MVC</title>
    </head>
     
    <body>
     
    <?php
    echo "test MVC2" ;
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/frontcontroller.php") ;
     
    	$front = Frontcontroller::getInstance()->dispatch();
     
    echo " successfully" ;
    ?>
    </body>
    </html>
    request.php
    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
    <?php
    class Request
    {
    	public function getParam($key)
    	{
    		return filter_var($this->getTaintedParam($key), FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
    	}
     
    	public function getTaintedParam($key)
    	{
    		if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST[$key])){
    			return $_POST[$key];
    		}else{
    			return $_GET[$key];
    		}
    	}
     
    	public function route()
    	{
    		$requestUri = substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'/'.basename(__FILE__)) + strlen('/'.basename(__FILE__)));
     
    		if (empty($requestUri)) 
    			return array();
    		$path = parse_url($requestUri, PHP_URL_PATH);
    		preg_match('#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#', $path, $matches);
    		$args = explode('&', parse_url($requestUri, PHP_URL_QUERY));
    		$matches['args'] = $args;
    		return $matches;
    	}
    }
    response.php
    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
    <?php
    class Response
    {
    	private $_vars = array();
    	private $_headers = array();
    	private $_body;
     
    	public function addVar($key, $value)
    	{
    		$this->_vars[$key] = $value;
    	}
     
    	public function getVar($key)
    	{
    		return $this->_vars[$key];
    	}
     
    	public function getVars()
    	{
    		return $this->_vars;
    	}
     
    	public function setBody($value)
    	{
    		$this->_body = $value;
    	}
     
    	public function redirect($url, $permanent = false)
    	{
    		if ($permanent){
    		$this->_headers['Status'] = '301 Moved Permanently';
    		}else{
    		$this->_headers['Status'] = '302 Found';
    		}
    		$this->_headers['location'] = $url;
    	}
     
    	public function printOut()
    	{
    		foreach ($this->_headers as $key => $value) {
    		header($key. ':' . $value);
    		}
    		echo $this->_body;
    	}
    }
    frontcontroller.php
    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
    <?php
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/request.php") ;
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/response.php") ;
    class FrontController
    {	private $_defaults = array('module' => 'index', 'action' => 'index');
        private $_request;
        private $_response;
        private static $_instance = null;
     
        private function __construct()
        {
            $this->_request  = new Request();
            $this->_response = new Response();
        }
     
        public static function getInstance()
        {
            if (is_null(self::$_instance)){
            	self::$_instance = new self();
            }
            return self::$_instance;
        }
     
        public function dispatch($defaults = null)
        {
            $parsed = $this->_request->route();
            $parsed = array_merge($this->_defaults, $parsed);
            $this->forward($parsed['module'], $parsed['action']);
        }
     
        public function forward($module, $action)
        {
            $command = $this->_getCommand($module, $action);
            $command->launch($this->_request, $this->_response);
        }
     
        private function _getCommand($module, $action)
        {
            if(!file_exists($path = "$module/$action.php")){
            throw new Exception("Commande inconnue $module/$action.php");
            }
     
            require($path);
            $class = $action.'Action';
            return new $class($this);
        }
     
        public function getResponse()
        {
            return $this->_response;
        }
     
        public function redirect($url)
        {
            $this->_response->redirect($url);
        }
     
        public function render($file)
        {
            $view = new View();
            $this->_response->setBody($view->render($file,$this->_response->getVars()));
        }
    }
    ?>
    view.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class View
    {
        public function render($file, $assigns = array())
        {
            extract($assigns);
            ob_start();
            require($file);
            $str = ob_get_contents();
            ob_end_clean();
            return $str;
        }
    }
    et action.php
    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
    abstract class Action
    {
        protected $_controller;
     
        public function __construct($controller)
        {
        $this->_controller = $controller;
        }
     
        abstract public function launch(Request $request, Response $response);
     
        public function render($file)
        {
            $this->_controller->render($file);
        }
     
        public function printOut()
        {
            $this->_controller->getResponse()->printOut();
        }
     
        protected function _forward($module, $action)
        {
            $this->_controller->forward($module, $action);
        }
     
        protected function _redirect($url)
        {
            $this->_controller->redirect($url);
        }
    }
    Voilà, et il y a encore moyen de complexifier mais je m'arrêterai là pour le moment.
    Merci pour le support de tous !

  5. #5
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Modèle MVC avec <html & PHP
    Benjamin,

    Mon souci est que je ne parviens pas à voir comme exécuter une bête page comme celle-ci:

    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test MVC</title>
    </head>
     
    <body>
     
    <?php
    echo "test MVC2" ;
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/frontcontroller.php") ;
     
    $front = Frontcontroller::getInstance()->dispatch();
     
    echo " successfully" ;
    ?>
    <table border="0" cellpadding="0" cellspacing""0 width="300">
    <tr>
        <td width='10px'>&nbsp;</td>
        <td width='280px'></td>
        <td width='10px'></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
     	<td>
        	<form action="$_SERVER['PHP_SELF']" method="post" name="index">
                <table width="280" border="1">
                <tr>
                    <td width='40px'>&nbsp;</td>
                    <td width='200px'>&nbsp;</td>
                    <td width='40px'>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='center'>
                    	<a href="../menu.php">
                        	<input name="Accueil" type="submit" value="Bienvenue sur [Jecrapahute]" />
                        </a>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                </table>
    		</form>
    	</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    </table>
     
    </body>
    </html>

    Ensuite il y aura une autre bête page avec des champs à valider !
    Le bouton Valider étant intercepter par if (isset($_POST[bouton]))
    un bouton effacer et un derniere Sortie ou une même bête page affichera simplement AUREVOIR @bientôt

    Actuellement, quand j'exécute mon VirtuyalHost sous Apache 2.2.15, j'ai dans le log.php (5.3.5)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [07-May-2011 14:21:43] PHP Fatal error:  Uncaught exception 'Exception' with message 'Commande inconnue index/index.php' in F:\WebSites\mvc2\class\frontcontroller.php:41
    Stack trace:
    #0 F:\WebSites\mvc2\class\frontcontroller.php(34): FrontController->_getCommand('index', 'index')
    #1 F:\WebSites\mvc2\class\frontcontroller.php(29): FrontController->forward('index', 'index')
    #2 F:\WebSites\mvc2\index.php(14): FrontController->dispatch()
    #3 {main}
      thrown in F:\WebSites\mvc2\class\frontcontroller.php on line 41

    Ce qui a mon sens, reviens à dire qu'il n'a rien trouvé dans l'URL, mais l'URL d'une page index est 99/100 vide.....


    Je sais c'est con, mais c'est ainsi...
    Merci à tous ceux qui ont une expérience de la méthologie MVC

  6. #6
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Modèle MVC avec <html & PHP
    Bon, 1/2 journée avec Netbeans 7.0 pour piger le 1er modèle MVC, je me suis arrêté à la page 12 du document de Julien Pauli... et au vu du coding, il apparait que un répertoire INDEX serait nécessaire et que celui-ci contiendrait le fichier index.php, ce que j'ai essayé !
    Mon virtualhost serait: http://mvc/index/index.php

    Voici ce que me donne le log.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [08-May-2011 15:59:08] PHP Fatal error:  Uncaught exception 'Exception' with message 'Commande inconnueindex/index.php' in F:\WebSites\mvc\class\controller.php:37
    Stack trace:
    #0 F:\WebSites\mvc\class\controller.php(30): FrontController->_getCommand('index', 'index')
    #1 F:\WebSites\mvc\class\controller.php(26): FrontController->forward('index', 'index')
    #2 F:\WebSites\mvc\index\index.php(14): FrontController->dispatch()
    #3 {main}
      thrown in F:\WebSites\mvc\class\controller.php on line 37
    Voici le code du controllor:

    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
    <?php
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/class/request.php") ; 
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/class/response.php") ; 
     
    class FrontController
    {	private $_defaults = array('module' => 'index', 'action' => 'index');
    	private $_request;
    	private $_response;
    	private static $_instance = null;
    
    	private function __construct()
    	{
    		$this->_request  = new Request();
    		$this->_response = new Response();
    	}
    
    	public static function getInstance()
    	{	if (is_null(self::$_instance))
    			self::$_instance = new self();
    		return self::$_instance;
    	}
    
    	public function dispatch($defaults = null)
    	{	$parsed = $this->_request->route();
    		$parsed = array_merge($this->_defaults, $parsed);
    		$this->forward($parsed['module'], $parsed['action']);
    	}
    
    	public function forward($module, $action)
    	{	$command = $this->_getCommand($module, $action);
    		$command->launch($this->_request, $this->_response);
    	}
    
    	private function _getCommand($module, $action)
    	{   $path = "$module/$action.php" ;
            if (!file_exists($path)) 
    ==> 37            throw new Exception("Commande inconnue " . $path);
     
            require $_SERVER['DOCUMENT_ROOT'] . "/" . $path;
            $class = $action.'Action';
     ==> 41       return(new $class($this));
    	}
    
    	public function getResponse()
    	{
    		return $this->_response;
    	}
    	
    	public function redirect($url)
    	{
    		$this->_response->redirect($url);
    	}
    	
    	public function render($file)
    	{
    		$view = new View();
    		$this->_response->setBody($view->render($file,$this->_response->getVars()));
    	}
    }
    je ne comprends pas non plus la raison de créer une nouvelle variable en ligne 41...

    Bien des questions en suspens....



    Merci à ceusss qui ont maitrisé le modèle MVC


    En modifiant la fonction_getCommand du Controller comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	private function _getCommand($module, $action)
    	{   $path = $_SERVER['DOCUMENT_ROOT'] . "/" . "$module/$action.php" ;
            if (!file_exists($path)) 
                throw new Exception("Commande inconnue: " . $path);
     
            require $path;
            $class = $action.'Action';
            return(new $class($this));
    	}
    Cela semble passer mais j'obtiens un truc bizarre, à savoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [08-May-2011 19:00:33] PHP Fatal error:  Cannot redeclare launch() (previously declared in F:\WebSites\mvc\index\index.php:16) in F:\WebSites\mvc\index\index.php on line 21
    
    [08-May-2011 19:00:33] PHP Stack trace:
    
    [08-May-2011 19:00:33] PHP   1. {main}() F:\WebSites\mvc\index\index.php:0
    
    [08-May-2011 19:00:33] PHP   2. FrontController->dispatch($defaults = *uninitialized*) F:\WebSites\mvc\index\index.php:14
    
    [08-May-2011 19:00:33] PHP   3. FrontController->forward($module = *uninitialized*, $action = *uninitialized*) F:\WebSites\mvc\class\controller.php:26
    
    [08-May-2011 19:00:33] PHP   4. FrontController->_getCommand($module = *uninitialized*, $action = *uninitialized*) F:\WebSites\mvc\class\controller.php:30
    Et là, c'est correct, c'est un bête copier/coller que je ne comprends pas...

    Donc:

  7. #7
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Modèle MVC avec html & PHP
    Benjamin,

    La commande quelconque de la page 12

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function launch(Request $request, Response $response)
    	{	$variable = 'essai de variable';
    		$response->addVar('unevariable',$variable);
    		$this->render(dirname(__FILE__).'/show.php');
    		$this->printOut();
    	}
    Se met ou ?

    Car dans le log.php, j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [09-May-2011 18:37:59] PHP Fatal error:  Cannot redeclare launch() (previously declared in F:\WebSites\mvc\index\index.php:16) in F:\WebSites\mvc\index\index.php on line 21
    
    [09-May-2011 18:37:59] PHP Stack trace:
    
    [09-May-2011 18:37:59] PHP   1. {main}() F:\WebSites\mvc\index\index.php:0
    
    [09-May-2011 18:37:59] PHP   2. FrontController->dispatch($defaults = *uninitialized*) F:\WebSites\mvc\index\index.php:14
    
    [09-May-2011 18:37:59] PHP   3. FrontController->forward($module = *uninitialized*, $action = *uninitialized*) F:\WebSites\mvc\class\controller.php:26
    et le "public" est refusé à l'interprétation si je mets ce code dans mon index.php

    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test MVC</title>
    </head>
    
    <body>
    
    <?php
    echo "test MVC" ;
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/controller.php") ;
    
    	$front = FrontController::getInstance()->dispatch();
    
    	public function launch(Request $request, Response $response)
    	{	$variable = 'essai de variable';
    		$response->addVar('unevariable',$variable);
    		$this->render(dirname(__FILE__).'/show.php');
    		$this->printOut();
    	}
    ?>
    </body>
    </html>
    là, j'ai beau retourné le problème dans tous les sens, je ne pige pas !

    Encore 1X, merci à ceussss qui ont une expérience du modèle MVC

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'ai pas le temps de lire tout l'article alors je vois pas très bien où tu en es... Tu peux me qu'est ce qui coince dans la logique car je n'arrive pas à me faire une idée de l'étape ou tu en es avec les (trop) nombreuses portions de code.

    En tout cas l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    09-May-2011 18:37:59] PHP Fatal error:  Cannot redeclare launch() (previously declared in F:\WebSites\mvc\index\index.php:16) in F:\WebSites\mvc\index\index.php on line 21
    Fait référence à une méthode (ou fonction) qui tu as déclaré deux fois.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Hello ! Bon avant de rentrer dans le vif du sujet, est-ce que tu as bien compris l'architecture du modèle MVC ?
    Pour résumer : la classe FrontController (un singleton) retourne une instance d'elle même qui sera unique.
    Bon soit.

    Donc normalement dans ton index.php qui est le point d'entrée pour toutes les pages tu dois avoir juste :

    un require_once et le FrontController::getInstance()->dispatch(); (qui ne retourne rien donc pas besoin d'affecter une variable $front).

    Ensuite le dispatch() va décortiquer la route (= trouver le controleur et son action). Et le forward va justement "executer" l'action sur le controleur qui va bien.

    Bon là je sors un peu du tuto du site, que je trouve un peu trop complexe pour créer un MVC perso.

  10. #10
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Modèle MVC avec html & PHP
    Merci d'abord au dernier intervenant Euphocat du milieu de cette nuit !
    Je veux bien comprendre mais je suppose un tuto non testé !!!

    Benjamin,

    J'ai clôturé la discussion précédente à multiples post du WE et j'en ai crée une nouvelle qui fait le statut de la problématique MVC/Tuto !

    Le copier/coller a parfois ces avantages, c'est qu'il recopie les éventuelles erreurs de celui- ci et oblige le lecteur a se poser des questions.
    Si tu reprends le tuto en question, en page 12, tu vois une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public launch qui ne semble être appelée de nulle part mais c'est bien faux !

    Mais dans le controller page 11 dans la fonction forward

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     tu retrouves 		
    $command->launch($this->_request, $this->_response);
    
    et finalement, tu retrouves encore cette même fonction dans la abstract class (page 12)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    abstract class Action
    {
    	protected $_controller;
    	public function __construct($controller)
    	{
    		$this->_controller = $controller;
    	}
    	
    	abstract public function launch(Request $request, Response $response);

    Je vais te récapituler tous les bouts de code et classes que j'ai actuellement:

    REQUEST

    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
    <?php
    class Request
    {
    	public function getParam($key)
    	{
    		return filter_var($this->getTaintedParam($key), FILTER_SANITIZE_STRING,	FILTER_FLAG_NO_ENCODE_QUOTES);
    	}
     
    	public function getTaintedParam($key)
    	{
    		if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST[$key]))
    			return $_POST[$key];
    		else
    			return $_GET[$key];
    	}
     
    	public function route()
    	{
    		$requestUri = substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'/'.basename(__FILE__)) + strlen('/'.basename(__FILE__)) );
     		if (empty($requestUri)) 
    			return array();
    		$path = parse_url($requestUri, PHP_URL_PATH);
    		preg_match('#^(/(?P<module>\w+))(/(?P<action>\w+)/?)?$#', $path, $matches);
    		$args = explode('&', parse_url($requestUri, PHP_URL_QUERY));
    		$matches['args'] = $args;
    		return $matches;
    	}
    /**
    *	End of class
    *
    */
    RESPONSE
    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
    <?php
    class Response
    {
    	private $_vars = array();
    	private $_headers = array();
    	private $_body;
     
    	public function addVar($key, $value)
    	{
    		$this->_vars[$key] = $value;
    	}
     
    	public function getVar($key)
    	{
    		return $this->_vars[$key];
    	}
     
    	public function getVars()
    	{
    		return $this->_vars;
    	}
     
    	public function setBody($value)
    	{
    		$this->_body = $value;
    	}
     
    	public function redirect($url, $permanent = false)
    	{
    		if ($permanent){
    		$this->_headers['Status'] = '301 Moved Permanently';
    		}else{
    		$this->_headers['Status'] = '302 Found';
    		}
    		$this->_headers['location'] = $url;
    	}
     
    	public function printOut()
    	{
    		foreach ($this->_headers as $key => $value) {
    		header($key. ':' . $value);
    		}
    		echo $this->_body;
    	}
    }
    ?>
    CONTROLLER
    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
    <?php
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/class/request.php") ; 
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/class/response.php") ; 
     
    class FrontController
    {	private $_defaults = array('module' => 'index', 'action' => 'index');
    	private $_request;
    	private $_response;
    	private static $_instance = null;
    
    	private function __construct()
    	{
    		$this->_request  = new Request();
    		$this->_response = new Response();
    	}
    
    	public static function getInstance()
    	{	if (is_null(self::$_instance))
    			self::$_instance = new self();
    		return self::$_instance;
    	}
    
    	public function dispatch($defaults = null)
    	{	$parsed = $this->_request->route();
    		$parsed = array_merge($this->_defaults, $parsed);
    		$this->forward($parsed['module'], $parsed['action']);
    	}
    
    	public function forward($module, $action)
    	{	$command = $this->_getCommand($module, $action);
    		$command->launch($this->_request, $this->_response);
    	}
    
    	private function _getCommand($module, $action)
    	{   $path = $_SERVER['DOCUMENT_ROOT'] . "/" . "$module/$action.php" ;
            if (!file_exists($path)) 
                throw new Exception("Commande inconnue: " . $path);
     
            require($path) ;
            $class = $action.'Action';
            return(new $class($this));
    	}
    
    	public function getResponse()
    	{
    		return $this->_response;
    	}
    	
    	public function redirect($url)
    	{
    		$this->_response->redirect($url);
    	}
    	
    	public function render($file)
    	{
    		$view = new View();
    		$this->_response->setBody($view->render($file,$this->_response->getVars()));
    	}
    }
    VIEW
    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
     
    <?php
    class View
    {
    	public function render($file, $assigns = array())
    	{
    		extract($assigns);
    		ob_start();
    		require($file);
    		$str = ob_get_contents();
    		ob_end_clean();
    		return $str;
    	}
    }
    ?>
    ACTION
    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
    <?php
    abstract class Action
    {
    	protected $_controller;
    	public function __construct($controller)
    	{
    		$this->_controller = $controller;
    	}
     
    	abstract public function launch(Request $request, Response $response);
     
    	public function render($file)
    	{
    		$this->_controller->render($file);
    	}
     
    	public function printOut()
    	{
    		$this->_controller->getResponse()->printOut();
    	}
     
    	protected function _forward($module, $action)
    	{
    		$this->_controller->forward($module, $action);
    	}
     
    	protected function _redirect($url)
    	{
    		$this->_controller->redirect($url);
    	}
    }
    ?>
    SHOW
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    echo $unevariable ;
    ?>
    et INDEX.PHP
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test MVC</title>
    </head>
     
    <body>
     
    <?php
    echo "test MVC" ;
    require_once ($_SERVER["DOCUMENT_ROOT"] . "/class/controller.php") ;
     
    	$front = FrontController::getInstance()->dispatch();
     
    	function launch(Request $request, Response $response)
    	{	$variable = 'essai de variable';
    		$response->addVar('unevariable',$variable);
    		$this->render(dirname(__FILE__).'/show.php');
    		$this->printOut();
    	}
    ?>
    </body>
    </html>
    INDEX.PHP qui contient la fonction LAUNCH en PUBLIC dans le tuto mais erreur de parsing PHP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [10-May-2011 09:22:15] PHP Parse error:  syntax error, unexpected T_PUBLIC in F:\WebSites\mvc\index\index.php on line 16
    Les seules modifs que j'ai faites se situent dans le getCommand du FrontController.

    Voilà, j'en ai terminé, j'espère le bootstrap qui me permettra de continuer...
    @+ et merci !

Discussions similaires

  1. [MVC] Conversion avec PropertyEditorSupport dans Spring MVC
    Par Mouns007 dans le forum Spring Web
    Réponses: 2
    Dernier message: 29/08/2014, 14h59
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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