Navigation tuto MVC jour 4

Par Hotelsavecvue, il y a 11 ans


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

8 réponses

Hotelsavecvue, il y a 11 ans

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 ^^

Hotelsavecvue, il y a 11 ans

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

Hotelsavecvue, il y a 11 ans
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 ?

Hotelsavecvue, il y a 11 ans

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
flug, il y a 11 ans

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é

Hotelsavecvue, il y a 11 ans

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... :)

Hotelsavecvue, il y a 11 ans

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 :)

flug, il y a 11 ans

Hum tu devrait faire un list plutot que de passer un table

un truc du genre :

list($controller, $action) = explode('/', $url['path']);