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
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'))))
Bonjour ,
La fonction "Index" devrait pas être "index" ??
pareil pour le render et le nom de ton index.php par la même.
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
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');
}
}