Bonjour,

j'ai suivi cette excellent tuto depuis le premier et vous remercie énormément pour tout ce travail. Tout a plutôt bien marché jusque là. Malheureusement, je me trouve bloqué dans la vidéo du jour 4 à 52:10 lorsque le routing de l'url est censé me donner grâce à des expressions régulières une url de la forme /post/slug-id.

Bizarrement en suivant parfaitement le tuto (j'ai vérifié trois fois les 10 dernières minutes du tuto et toutes les regex), le debug fonctionne parfaitement mais l'url reste en /posts/view/id.

Voici mon Router et mon conf.php. Peut être y verrez-vous des erreurs que je n'ai pas détectées.

Merci d'avance.

<?php 
class Router{
  static $routes = array();
  /**
  * Permet de parser une url
  * @param $url Url à parser
  * @return tableau contenant les paramètres
  **/

  static function parse($url,$request){
    $url = trim($url,'/');
    $params = explode('/', $url);
    $request->controller = $params[0];
    $request->action = isset($params[1]) ? $params[1] : 'index';
    $request->params = array_slice($params, 2);
    return true;
  }
  /**
   * Connect
   */
  static function connect($redir,$url){
    $r = array();
    $r'redir'] = $redir;
    $r'origin'] = preg_replace('/([a-z0-9]+):(^\/]+)/', '${1}:(?P<${1}>${2})', $url);
    $r'origin'] = '/'.str_replace('/','\/',$r'origin']).'/';

    self::$routes] = $r;
    debug($r);
  }
  static function url($url){
    foreach(self::$routes as $v){
      if(preg_match($v'origin'], $url, $match)){
        foreach ($match as $k => $w) {
          if (!is_numeric($k)) {
            $v'redir'] = str_replace(":$k", $w, $v'redir']);
          }
        }
        return $v'redir'];
      }
    }
    return $url;
  }
}
?>

<?php
class Conf{
  static $debug = 1;
  static $databases = array(
    'default' => array(
      'host' => 'localhost',
      'database' => 'test',
      'login' => 'root',
      'password' => ''
    )
  );
}
Router::connect('post/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
?>

4 réponses


Personne n'a idées ? Ca fait 4 jours que je bloque et je sèche vraiment.

Bonjour,

Dans le tuto du 6ème jour, Grafikart a donné le code du Router.
Je te met le code ici, peut être cela te permettra de te décoincer.

<?php
/**
* Classe de routing à utiliser pour un MVC 
* Permet de rediriger des URLs vers des URL au format MVC controller/action/param/param/param....
* Router::prefix('cockpit','admin');
* Router::connect('','posts/index');
* Router::connect('cockpit','cockpit/posts/index');
* Router::connect('blog/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
* Router::connect('blog/*','posts/*');
*
**/
class Router{

    static $routes = array(); 
    static $prefixes = array(); 

    /**
    * Ajoute un prefix au Routing
    **/
    static function prefix($url,$prefix){
        self::$prefixes$url] = $prefix; 
    }

    /**
    * Permet de parser une url
    * @param $url Url à parser
    * @return tableau contenant les paramètres
    **/
    static function parse($url,$request){
        $url = trim($url,'/'); 
        if(empty($url)){
            $url = Router::$routes[0]'url']; 
        }else{
            $match = false; 
            foreach(Router::$routes as $v){
                if(!$match && preg_match($v'redirreg'],$url,$match)){
                    $url = $v'origin'];
                    foreach($match as $k=>$v){
                        $url = str_replace(':'.$k.':',$v,$url); 
                    } 
                    $match = true; 
                }
            }
        }

        $params = explode('/',$url);
        if(in_array($params[0],array_keys(self::$prefixes))){
            $request->prefix = self::$prefixes$params[0]];
            array_shift($params); 
        }
        $request->controller = $params[0];
        $request->action = isset($params[1]) ? $params[1] : 'index';
        $request->params = array_slice($params,2);
        return true; 
    }

    /**
    * Permet de connecter une url à une action particulière
    **/
    static function connect($redir,$url){
        $r = array();
        $r'params'] = array();
        $r'url'] = $url;  

        $r'originreg'] = preg_replace('/([a-z0-9]+):(^\/]+)/','${1}:(?P<${1}>${2})',$url);
        $r'originreg'] = str_replace('/*','(?P<args>/?.*)',$r'originreg']);
        $r'originreg'] = '/^'.str_replace('/','\/',$r'originreg']).'$/'; 
        // MODIF
        $r'origin'] = preg_replace('/([a-z0-9]+):(^\/]+)/',':${1}:',$url);
        $r'origin'] = str_replace('/*',':args:',$r'origin']); 

        $params = explode('/',$url);
        foreach($params as $k=>$v){
            if(strpos($v,':')){
                $p = explode(':',$v);
                $r'params']$p[0]] = $p[1]; 
            }
        } 

        $r'redirreg'] = $redir;
        $r'redirreg'] = str_replace('/*','(?P<args>/?.*)',$r'redirreg']);
        foreach($r'params'] as $k=>$v){
            $r'redirreg'] = str_replace(":$k","(?P<$k>$v)",$r'redirreg']);
        }
        $r'redirreg'] = '/^'.str_replace('/','\/',$r'redirreg']).'$/';

        $r'redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
        $r'redir'] = str_replace('/*',':args:',$r'redir']); 

        self::$routes] = $r; 
    }

    /**
    * Permet de générer une url à partir d'une url originale
    * controller/action(/:param/:param/:param...)
    **/
    static function url($url = ''){
        trim($url,'/'); 
        foreach(self::$routes as $v){
            if(preg_match($v'originreg'],$url,$match)){
                $url = $v'redir']; 
                foreach($match as $k=>$w){
                    $url = str_replace(":$k:",$w,$url); 
                }
            }
        }
        foreach(self::$prefixes as $k=>$v){
            if(strpos($url,$v) === 0){
                $url = str_replace($v,$k,$url); 
            }
        }
        return BASE_URL.'/'.$url; 
    }

    static function webroot($url){
        trim($url,'/');
        return BASE_URL.'/'.$url; 
    }

}

Bonjour,
as-tu essayé de continuer le tuto ? Parce que sur celui des routeurs, j'ai bloqué longtemps avant de me rendre compte qu'en faisant la suite du tuto, ça débloquait mon pb. Peut-etre que ça marcherait pour toi également !

Ybi

mmmh, bonne idée, je vais continuer alors et tester avec cet autre router. Merci.:)