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'> </td>
<td width='280px'></td>
<td width='10px'></td>
</tr>
<tr>
<td> </td>
<td>
<form action="$_SERVER['PHP_SELF']" method="post" name="index">
<table width="280" border="1">
<tr>
<td width='40px'> </td>
<td width='200px'> </td>
<td width='40px'> </td>
</tr>
<tr>
<td> </td>
<td align='center'>
<a href="../menu.php">
<input name="Accueil" type="submit" value="Bienvenue sur [Jecrapahute]" />
</a>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
</form>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </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 ;);)
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....
:help::help::help::help:
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: :help::help::help::help:
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 :mouarf::mouarf:
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 !