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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 Expert 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
    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 confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    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
    Membre éclairé 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
    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
    Membre éclairé 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
    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
    Membre éclairé 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
    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
    Membre éclairé 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
    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
    Membre éclairé 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
    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, 15h59
  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, 15h14
  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, 13h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 12h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 13h29

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