Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Actuellement je cherche à faire un routeur en orienté objet fait maison, voici pour le moment ce que fais mon programme et où j'en suis :

  • L'utilisateur saisie une url, ex : http://monsite.com/monCompte/mesPersonnages/Lou
  • La classe routeur traite l'url

    • Découpage de l'url dans un tableau et vérification de toutes les entrées
      • Si monCompteController.php existe alors on l'ajoute au tableau $this->_routing['controller']
      • On vérifie l'entrée suivante
      • Si mesPersonnageController.php existe alors on remplace au tableau $this->_routing['controller'] = 'mesPersonnages';
      • On vérifie l'entrée suivante
      • Si LouController.php existe -> ce n'est pas le cas
      • On fait un require de $this->_routing['controller'] et on vérifie si une méthode existe avec ce nom via call_user_fonc('Lou')
      • Ce n'est pas le cas, on passe donc 'Lou' dans le tableau en tant que paramètre $this->_routing['params'] = ['Lou']
      • N'ayant plus d'entrée dans l'url et le $this->_routing['action'] étant toujours vide, on lui passe la valeur "defaut".

    Pour le moment je gère l'affichage en me rendant dans mesPersonnagesController.php et en mettant ce code là :

    function defaut(){
    if(func_num_args() > 0 && is_array($params = func_get_arg(0))){
        $title = $params[0];
        $content = APP.'views/mesPersonnages/personnage.php';
        require_once(ROOT.'public/layouts/defaut.php');
    }
    else{
        $title = 'Tous mes personnages';
        $content = APP.'views/mesPersonnages/defaut.php';
        require_once(ROOT.'public/layouts/defaut.php');
    }
    }

Ce que je veux

Pouvoir mettre à la place de ce code quelque chose dans ce type :

function defaut(){
    if(func_num_args() > 0 && is_array($params = func_get_arg(0))){
        generateView($params[0], 'personnages.php', 'defaut');
    }
    else{
        generateView('Tous mes personnages', 'defaut.php', 'defaut');
    }
}

Ce que j'obtiens

Rien. Lorsque je fais un var_dump($Routeur->_routing). je n'obtiens rien du tout. Je pensais au départ que c'était à cause du fait que ce ne soit pas en publique mais ce n'est pas le cas.
J'ai l'impression qu'en fait, à partir du moment où je rentre dans la fonction, tout ce qui a été fait avant avec index.php disparaît.
Pour tester j'ai mis une variable $test = 'aa' dans mon index.php et en effet quand je fais un var_dump($test) dans mon fichier 'mesPersonnagesController.php' il ne me trouve pas la variable.
Mon seul moyen est donc de faire une classe View que j'incorpore dans la classe Routeur mais même en faisant ça je ne peux pas l'appeler dans la fonction 'defaut()' de mesPersonnagesController.php.

4 réponses


Bonsoir.
Et donc ?
Tu ne nous montre qu'une fonction, je vois donc mal comment nous pourrions t'aider.
Par conséquent montres déjà plutôt la classe en elle même, soit la classe Router d'après tes dires, ainsi que la manière que tu l'instancie et l'utilises, ainsi que l'endroit ou tu fais un débug de la propriété _routing.

Raizenn
Auteur

Je veux bien mais c'est juste que c'est un peu compliqué de tout mettre ici, j'vais essayer :)

index.php

define('ROOT', $_SERVER['CONTEXT_DOCUMENT_ROOT'].'/');
define('APP', ROOT.'app/');

require_once(APP.'kernel/Autoloader.php');
Autoloader::register();

$Routeur = new Routeur();
$Routeur->run();
$test = $Routeur->_routing;

Routeur.php

Class Routeur{

    public $_url='';
    public $_routing = array(
    'controller' => '',
    'method' => '',
    'params' => array()
    );

    public function __construct(){
        if(isset($_GET['url'])){
            $url = $_GET['url'];
        }
        else{
            $url = '/';
        }
        $verif = $this->verification($url);

        if($verif !== false){
            $this->_url = $verif;
            $this->creationRoutage();
        }
    }

    private function creationRoutage(){
        $url = explode('/', $this->_url);
        $nbParties = count($url);

        if($nbParties==1){
            $this->_routing['controller'] = $url[0];
            $this->_routing['method'] = 'defaut';
        }
        else{
            for($i=0;$i<$nbParties;$i++){
                if(file_exists(APP.'controllers/controller'.ucfirst($url[$i]).'.php') == true){
                    $this->_routing['controller'] = $url[$i]; // ajout du routeur dans le _routing
                    array_shift($url); // on enlève l'élément du tableau pour ne plus avoir de contrôleur
                    $nbParties -= 1; // permet de remettre à jour la boucle
                    $i -= 1; // permet de remettre à jour la boucle
                }
                else{
                    if($this->_routing['controller'] != ''){
                        require_once(APP.'controllers/controller'.ucfirst($this->_routing['controller']).'.php');
                    }
                    else{
                        $this->_routing['controller'] = 'erreurs';
                    }
                }
            }
            if(empty($url)){
                $this->_routing['method'] = 'defaut';
                $this->_routing['params'] = '';
            }
            else{
                for($i=0;$i<$nbParties;$i++){
                    if(function_exists($url[$i]) == true){
                        $this->_routing['method'] = $url[$i];
                        array_shift($url); // on enlève l'élément du tableau pour ne plus avoir de contrôleur
                        $nbParties -= 1; // permet de remettre à jour la boucle
                        $i -= 1; // permet de remettre à jour la boucle
                    }
                }
                if($this->_routing['method'] == ''){
                    $this->_routing['method'] = 'defaut';
                }
                foreach($url as $key){
                    $this->_routing['params'][] = $key;
                }
            }
        }
        // var_dump($this->_routing);
    }

    public function getRouting(){
        return $this->_routing;
    }

    private function verification($urlAvantVerif){
        $Route = new Route($urlAvantVerif);

        return $Route->_routes;
    }

    public function run(){
        if($this->_url !== ''){
            if($this->_routing['controller'] != 'erreurs'){
                require_once(APP.'controllers/controller'.ucfirst($this->_routing['controller']).'.php');

                if($this->_routing['params'] != array()){
                    call_user_func($this->_routing['method'], $this->_routing['params']);
                }
                else{
                    call_user_func($this->_routing['method']);
                }

                // $View = new View($this->_routing);
            }
            else{
                header('Location: /erreurs/404');
            }
        }
        else{
            header('Location: /erreurs/404');
        }
    }

}

Et un exemple de contrôleur :
personnageController.php

function defaut($personnage){
    var_dump($test); // n'affiche rien
    $title = $personnage[0];
    $content = APP.'views/personnage/defaut.php';
    require_once(ROOT.'public/layouts/defaut.php');
}

function ajouter(){
    $title = 'Ajouter un personnage';
    $content = APP.'views/personnage/ajouter.php';
    require_once(ROOT.'public/layouts/defaut.php');
}

function modifier($personnage){
    $title = 'Modifier le personnage '.$personnage[0];
    $content = APP.'views/personnage/modifier.php';
    require_once(ROOT.'public/layouts/defaut.php');
}

function supprimer($personnage){
    $title = 'Supprimer le personnage '.$personnage[0];
    $content = APP.'views/personnage/supprimer.php';
    require_once(ROOT.'public/layouts/defaut.php');
}

Pour commencer, ce n'est pas Class mais class.
Ensuite, ton routeur n'en est pas un, ton routeur est censé pouvoir enregistrer plusieurs url et non une seule, de plus que dans l'exemple que tu donnes, tu n'en enregistre aucune.
Tout ce que tu fais c'est tester le retour de la propriété _routing, qui contient par défaut 3 index avec des valeurs vides.
Ta classe Route, semble clairement être mal conçue, elle est censé être un objet qui représente une url et la classe Router est censé être un objet qui représente l'ensemble des routes/url, sauf que dans ta classe Route, tu aurais une propriété _routes qui semble contenir l'ensemble de plusieurs routes/url, par conséquent c'est contradictoire.
Si tu veux apprendre à faire un routeur perso, tu devrais commencer par prendre exemple sur celui du tutoriel qui est présent sur le site.
Autre chose, tu parles dans ton exemple d'un fichier qui se nommerait personnageController.php, sauf que dans la méthode run, tu incluerais un fichier dont le nom commencerait par controller, je vois donc mal comment tu pourrais inclures un fichier dont le nom commencerait par personnage.

Raizenn
Auteur

Je pensais que la classe Routeur permettait de prendre en entrée l'url et ensuite de s'en servir pour structurer tout ce que je pourrai avoir besoin. D'où le fait que la classe me permette de require les fichiers controllers, models et views adéquates. Je ne voyais pas le routeur comme une classe pouvant contenir plusieurs url. Et je pense que tout mon raisonnement est basé sur le fait que le routeur ne peut avoir qu'une seule url.

J'ai effectivement regardé la vidéo poo : le routeur mais je n'avais pas tout compris et beaucoup de questions restaient en suspend, de plus l'utilisation des namespaces m'embrouillait pas mal (même si dans le fond je peux voir leur utilité).

Enfin j'ai un peu de mal à comprendre pourquoi stocker plusieurs url dans la classe Routeur ? Ou même dans les vidéos de Grafikart, je le vois ajouter plusieurs routes les unes à la suite des autres, dois-t-on aussi vraiment inscrire toutes les urls de notre site dans un fichier ?