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


flug
Réponse acceptée

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']);