Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/05/2011, 11h23   #1
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

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

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
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 :
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 :
PHP Parse error:  syntax error, unexpected T_PUBLIC in F:\WebSites\mvc\index.php on line 17
Voici le controller.php

Code :
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 :
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 :
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 :
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
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/05/2011, 12h08   #2
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Salut,
l'erreur est assez parlante
Tu mets un public dans ta signature :

Code :
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
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 12h19   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/05/2011, 15h36   #4
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

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

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
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 :
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 :
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 :
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 :
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 :
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 :
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 !
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 13h54   #5
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

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

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
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 :
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 :
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
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2011, 16h05   #6
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

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

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
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 :
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 :
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 :
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 :
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:
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h32   #7
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

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

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
Par défaut Modèle MVC avec html & PHP

Benjamin,

La commande quelconque de la page 12

Code :
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 :
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 :
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
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 22h18   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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 :
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/05/2011, 01h06   #9
Invité régulier
 
Inscription : mai 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 7
Points : 6
Points : 6
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.
euphocat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 09h25   #10
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

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

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
1
2
3
<?php
echo $unevariable ;
?>
et INDEX.PHP
Code :
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 :
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 !
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h06.


 
 
 
 
Partenaires

Hébergement Web