Hello !
J'ai suivi le tuto Créer un site MVC plus ou moins à la lettre, mais lors de l'ajout de la pagination, mon contrôlleur ne se charge plus.
Le $_GET fait tout planter.
Mon Request.php
class Request{
public $url;
public $page=1;
/**
* Retranscrit l'URL sous forme de chaine
* @param
* @return
**/
function __construct(){
$this->url = str_replace(BASE_URL."/", "", $_SERVER['REQUEST_URI']);
//$this->url = isset($_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : '/' ;
if(isset($_GET['page'])){
if(is_numeric($_GET['page'])){
if($_GET['page']>0){
$this->page= round($_GET['page']);
}
}
}
var_dump($this);
}
}
J'ai pu voir que le problème a déjà été soulevé, sans réellement qu'une réponse n'ait été clairement définie.
Merci d'avance pour vos idées
Tu devrais peut être regarder cette fonction parse_url pour bien parser ton url parce qu'a priorie ton controller retourn actus?page=2'
du coup ta method doit etre mal appelé
L'erreur que ça me retourne :
Fatal error: require(): Failed opening required 'C:\wamp\www\hvtv\controller\Controller.php' (include_path='.;C:\php\pear') in C:\wamp\www\hvtv\core\Dispatcher.php on line 52
class Dispatcher {
public $request;
/**
* Construction de l'object Dispatcher et définition du contrôler/actions/params par la requète de l'utilisateur
* @param none
* @return none
* */
function __construct() {
$this->request = new Request();
try {
Router::parse($this->request->url, $this->request);
$controller = $this->loadController();
if(!in_array($this->request->action, array_diff(get_class_methods($controller),get_class_methods('Controller')))){
$this->error('Le controller'.$this->request->controller.'n\'a pas de méthode'.$this->request->action);
}
call_user_func_array(array($controller, $this->request->action), $this->request->params);
$controller->render($this->request->action);
} catch (Exception $e) {
return $e->getMessage();
}
}
/**
* Rend une page d'erreur avec le $message
* Charge un faux controlleur qui appelle la fonction d'erreur correspondant
* @param String $message
*/
function error($message) {
$controller=new Controller($this->request);
$controller->e404($message);
die();
}
/**
* Charge le bon controlleur
* @param none
* @return FILE
* */
function loadController() {
$name = ucfirst($this->request->controller) . 'Controller';
$file = ROOT . DS . 'controller' . DS . $name . '.php';
require $file;
return new $name($this->request);
}
}
J'ai vu que certains avaient dû faire des preg_replace pour "enlever" le $_GET dans le LoadController(), serais_ce ça ?
Il me semble que le problème vient de mon Router qui parse mal l'URL. Le contrôleur n'est absolument pas le bon.
static function parse($url, $request){
$url=trim($url,'/');
$params=explode('/', $url);
//var_dump($params);
$request->controller = $params[0];
$request->action = isset($params[1]) ? $params[1] : 'index';
$request->params=array_slice($params, 2);
var_dump($request);
return true;
}
Mon var_dump($request) :
object(Request)[2]
public 'url' => string '/actus?page=2' (length=13)
public 'page' => float 2
public 'controller' => string 'actus?page=2' (length=12)
public 'action' => string 'index' (length=5)
public 'params' =>
array (size=0)
empty
J'ai justement suivi les tutos. Après il est tout à fait possible que je suis passé à côté de quelques secondes par-ci par-là pendant les vidéos ^^
Yep, j'ai pu remarquer que mon Controller ne se chargait pas. Ma fonction est pourtant similaire à celle du tuto, à quel moment @Grafikart arrive à récupérer le $_GET ? Car selon le code, il n'y a rien qui permet de récupérer cette variable dans la fonction Router::parse
Merci pour le parse_url, les valeurs de retour de cette fonction devraient résoudre mon problème.
Affaire à suivre... :)
J'ai résolu mon souci grâce à parse_url :)
Voici ma fonction si ça peut aider quelqu'un pour la suite.
Router.php
static function parse($url, $request){
//$url=trim($url,'/');
//$params=explode('/', $url);
//var_dump($params);
$url= parse_url($url);
//var_dump($url);
$params= explode('/', $url['path']);
//var_dump($params);
$request->controller = $params[1];
$request->action = isset($params[2]) ? $params[2] : 'index';
$request->params=array_slice($params, 3);
var_dump($request);
return true;
}
Encore merci pour l'aide :)
Hum tu devrait faire un list plutot que de passer un table
un truc du genre :
list($controller, $action) = explode('/', $url['path']);