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);
}
}
?>
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.
salut
si $this->request n'est pas un objet, il faut regarder la ou tu crée request; peux tu poster request.php?
eric
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 !!