Dans le tuto "Développer un site de A à Z, jour 4 : Gestion des routes", au moment 0:44:54, alors qu'on teste une expression régulière avec la fonction "debug()", au lieu du "OK" attendu, j'obtiens ce message d'erreur :

( ! ) Warning: Illegal string offset 'origin' in C:\wamp\www\tuto\core\Router.php on line 38 Call Stack #TimeMemoryFunctionLocation 10.0006144608{main}( )..\index.php:0 20.0042198112Dispatcher->__construct( )..\index.php:10 32.0148226880Controller->render( )..\Dispatcher.php:14 42.0157248080require( 'C:\wamp\www\tuto\view\posts\index.php' )..\Controller.php:36 52.0157248360Router::url( )..\index.php:9

et le tableau suivant :

( ! ) Warning: preg_match(): No ending delimiter '/' found in C:\wamp\www\tuto\core\Router.php on line 38
Call Stack
# Time Memory Function Location
1 0.0006 144608 {main}( ) ..\index.php:0
2 0.0042 198112 Dispatcher->__construct( ) ..\index.php:10
3 2.0148 226880 Controller->render( ) ..\Dispatcher.php:14
4 2.0157 248080 require( 'C:\wamp\www\tuto\view\posts\index.php' ) ..\Controller.php:36
5 2.0157 248360 Router::url( ) ..\index.php:9
6 2.0160 248496 preg_match ( ) ..\Router.php:38

puis, en bas, le lien :
posts/view/id:3/slug: mon-premier-article">Lire la suite ?

le fichier tuto\core\Router.php, le voici :

<?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'origin'] = '/'.str_replace('/', '\/', $url).'/';
        self::$routes = $r;
        debug($r);
    }
    /**
    *
    **/
    static function url($url){
        foreach (self::$routes as $v) {
            if (preg_match($v'origin'], $url,$match)) {
                debug('OK');
            }
        }
        return $url;
    }
}

J'ai beau relire, revisionner la vidéo, je ne vois pas où j'ai pu faire une erreur...
Quelqu'un pourrait m'aider ?
Merci d'avance pour votre collaboration.

7 réponses


Markos
Auteur
Réponse acceptée

J'ai trouvé ! Après une journée complète passée à chercher les différences... :
ci-dessus lignes 28 et 29 :

self::$routes = $r;
        debug($r);

alors qu'il fallait mettre :

self::$routes] = $r;
        debug($r);

(la différence est dans les crochets ]...)

Je vais pouvoir continuer ce travail de fourmi : visionner, mettre sur pause, comprendre, recopier le code, redémarrer la vidéo, et ainsi de suite...
Heureusement que tout ça me passionne ! Je ne lâcherai pas !

Bonjour,

En rapport à ton message d'erreur visiblement ça vient de ton preg_match où aucun délimiteur de fin a été trouvé !

je dirais que ça vient de tes paramètres liés mais je n'ai pas fais le tuto du coup je sais pas !

YO.

Ça veut tout simplement dire que $v'origin'] est vide. (ou plutôt qu'il ne contient que le caractère "/")
T'es sûr que tu n'as pas d'autres erreurs? ^^

Markos
Auteur

Je comprends bien que ça vient de mon preg_match, et je vois bien qu'aucun délimiteur n'a été trouvé : c'est ce qui est écrit. Et en effet, $v'origin'] a bien l'air vide. Le problème, c'est que je ne vois aucune différence avec ce qu'il y a dans la vidéo (quelqu'un qui l'a visionnée pourrait-il m'aider ?), et qu'avec toutes ces variables qui renvoient à d'autres, je suis un peu perdu. D'où viennent ce $v'origin'], et ce $r'origin'] ? Et pourquoi ai-je l'impression que l'expression :

$r'origin'] = '/'.str_replace('/', '\/', $url).'/';

est bizarre, avec son '\/' pour figurer les antislashs ? Le résultat de debug($r) à l'écran est déroutant :
Array
(
[origin] => /posts\/view\/id:([0-9]+)\/slug:([a-z0-9-]+)/
)
C'est pourtant bien ce que Grafikart a également à son écran dans la vidéo (mais lui, il n'a pas de message d'erreur, pourtant).

C'est une bonne chose que ça te passionne ! C'est comme ça que tu apprends vite !
Félicitation et n'oublie pas de mettre le sujet en résolu ! :)

Bonne continuation !

Salut! je vient juste de me mettre au MVC c'est pourquoi je regarde ce tuto. j'ai le même problème que toi et j'aimerai savoir si tu as pu trouver une solution??

oui il a trouvé, regarder le post en vert.