Bonjour à tous,

aujourd'hui j'ai voulu réaliser le tutoriel "Développer votre site de A à Z, jour 2, La structure PHP" et j'ai été confronté à un problème au niveau du $this->request->controller. En effet, il n'est pas reconnu en tant qu'objet.
Lorsque je souhaite appeler la vue dans Controller.php, je crée une variable $view comme ceci :

$view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';

Or, le $this->request->controller lance l'erreur suivante :
Notice: Trying to get property of non-object in C:\wamp\www\architecture_grafikart\core\Controller.php on line 24

L'erreur est assez claire mais je n'arrive pas à voir d'où cela provient. J'ai fait un var_dump de $this->request et j'obtiens null, il y a donc certainement un souci à ce niveau là.

Je vous passe quelques fichiers, n'hésitez pas à me demander si vous avez besoin de voir autre chose. En espérant que quelqu'un saura m'aider, je vous remercie par avance pour vos réponses.

<?php
class Controller {
    public $request;
    private $vars = array();
    public $layout = 'default';
    private $rendered = false;
    function __contruct($request) {
        $this->request = $request;
    }
    public function render($view) {
        if($this->rendered) {
            return false;
        }
        extract($this->vars);
        if(strpos($view,'/')===0){
            $view = ROOT.DS.'view'.$view.'.php';
        }
        else {
            $view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
        }

        ob_start();
        require($view);
        $content_for_layout = ob_get_clean();
        require(ROOT.DS.'view'.DS.'layout'.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;
        }
    }

}

?>

<?php
class Dispatcher{
    var $request;
    function __construct() {
        $this->request = new Request();
        Router::parse($this->request->url,$this->request);
        $controller = $this->loadController();
        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(array($controller,$this->request->action), $this->request->params);
        $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();
    }
    function loadController() {
        $name = ucfirst($this->request->controller).'Controller';
        $file = ROOT.DS.'controller'.DS.$name.'.php';
        require $file;
        return new $name($this->request);
    }
}

?>

5 réponses


Word
Auteur
Réponse acceptée

Ok je viens de trouver l'erreur...

Dans le fichier Controller.php il n'y a pas écrit __construct mais __contruct... Passer des heures pour quelque chose d'aussi bête...

Merci Erfou d'avoir regardé tout de même.

Word
Auteur

Personne n'aurait une petite idée ?

Merci...

salut

si $this->request n'est pas un objet, il faut regarder la ou tu crée request; peux tu poster request.php?

eric

Word
Auteur

Oui, le voici :

<?php
class Request{
    public $url; // URL appelée par l'utilisateur
    function __construct() {
        $this->url = str_replace(BASE_URL."/", "", $_SERVER'REQUEST_URI']);;
    }

}

?>

Bonjour !
bizarrement j'avais fait exactement la meme erreur ! et j'y ai passé 3h a chercher ! repasser le tuto 3 fois :s
Merci !!