Bonjour, j'espère ne pas me tromper de section pour le message,

J'ai un peu de mal à voir d'où vient mon erreur, surement un truc tout bête mais bon...
Mon problème est le suivant :

Je suis toujours rediriger sur la page 404, cela fonctionne bien lorsque l'appel d'une vue ou d'une action n'existe pas, mais lorsque je souhaite appeler une vue existante, je suis automatiquement rediriger sur la page 404.

mon dossier vue se présente de la façon suivante :
-> BoLayout -> BoDefault.php
-> Errors -> 404.php
-> Pages -> Index.php

Ici le code du Dispatcher.php

<?php
class Dispatcher{
    var $request;
    function __construct()
    {
        $this->request = new Request();
        Router::parse($this->request->url, $this->request);
        $controller = $this->loadController();
        //get_class_methods — Retourne les noms des méthodes d'une classe
        if (!in_array($this->request->action, get_class_methods($controller))) {
            $this->error('le controller' . $this->request->controller . 'n\'a pas de méthode' . $this->request->action);
        }
        // call_user_func_array — Appelle une fonction de rappel avec les paramètres rassemblés en tableau
        // premier paramètre la fonction de rappel à appeler
        // les paramètres à passer à cette fonction de rappel
        call_user_func_array(array($controller, $this->request->action), $this->request->params);
        //rend la vue qui correspond
        $controller->render($this->request->action);
    }
    function error($message) {
        header("HTTP/1.0 404 Not Found");
        $controller = new Controller($this->request);
        $controller->set('message',$message);
        $controller->render('/Errors/404');
        die();
    }

    /**
     * Cette fonction à pour but de charger le controller
     * @return mixed
     */
    function loadController() {
        //ucfirst met le premier caractère en majuscule
        $name = ucfirst($this->request->controller).'Controller';
        // on inclut le fichier
        $file = ROOT.DS.'controller'.DS.$name.'.php';
        require $file;
        return new $name($this->request);
    }
}

Ici le code du Controller principal :

<?php
class Controller {

    public $request;
    private $vars=array();
    public $layout = 'BoDefault';
    private $rendered = false;
    function __construct($request) {
        $this->request = $request;
    }
    public function render($view) {
        if($this->rendered){
            return false;
        }
        //extract — Importe les variables dans la table
        extract($this->vars);
        //strpos — Cherche la position de la première occurrence dans une chaîne
        if(strpos($view,'/')===0){
            $view = ROOT.DS.'view'.$view.'.php';
        }
        else {
            $view = ROOT . DS . 'view' . DS . $this->request->controller . DS . $view . '.php';
        }
        //ob_start() démarre la temporisation de sortie.
        //Tant qu'elle est enclenchée, aucune donnée, hormis les en-têtes, n'est envoyée au navigateur, mais temporairement mise en tampon.
        ob_start();
        require($view);
        //ob_get_clean — Lit le contenu courant du tampon de sortie puis l'efface
        $content_test = ob_get_clean();
        require ROOT.DS.'view'.DS.'BoLayout'.DS.$this->layout.'.php';
        $this->rendered = true;
    }
    public function set($key,$value=null) {
        if (is_array($key)) {
            $this->vars += $key;
        }
        else {
            $this->vars$key] = $value;
        }
    }
}

Merci d'avance pour votre aide

6 réponses


Carouge10
Réponse acceptée

Bonjour,

Il manque quelque infos pour tester l’existence du controller:

// Permet de tester si l'action existe bien et qu'elle est bien dans le controller et non celui du parent
        if(!in_array($this->request->action, array_diff(get_class_methods($controller), get_class_methods('Controller'))))
Underscreen
Réponse acceptée

Bonjour ,

La fonction "Index" devrait pas être "index" ??
pareil pour le render et le nom de ton index.php par la même.

Jibai
Auteur

Hélas malgré la modification le problème persiste

Le layout est bien pris en charge, mais il intègre automatiquement la page 404 et non ma page index, quand je suis sur une url valide

Puis-je avoir la page request.php ainsi que l'url que vous avez saisi ?

Merci.

Jibai
Auteur

http://localhost/mariage/pages voici une url valide (un site de mariage en construction ;) )

La classe request :

<?php
class Request {
    public $url; // URL appellé par l'utilisateur
    function __construct() {
    $this->url = $_SERVER'PATH_INFO'];
    }
}

Je rajoute au passage le controller Pages

<?php
class PagesController extends Controller {
    function Index() {
        $this->render('Index');
    }
}
Jibai
Auteur

C'était bien ça..., merci pour vos aides !