Bon, je viens de finir le premier tuto mais il y a tourjours ce message d'erreur de la 27eme minutes. Meme avec les gestions d'erreurs rien n'y fait...

Voici l'erreur:

Voici mon controller.php:

<?php
class controller{   
    public $request;
    public $vars = array();
    public $layout = 'default';
    private $rendered = false;
    function __construct($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 += $keys;               
        }else{
            $this->vars$keys] = $value;     
        }   
    }

    }
?>

J'ai suivi le tuto à la lette et je l'ai refait 2 fois... Je ne comprends pas?
Quelqu'un sait ce qui ne va pas?

21 réponses


Tu as oublié une petite fermeture d'une fonction,
voilà le code exacte.

<?php
class controller{  

    public $request;
    public $vars = array();
    public $layout = 'default';
    private $rendered = false;

    function __construct($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 += $keys;               
        }else{
            $this->vars$keys] = $value;    
        }  
    }

    }
?>

merci je n'ai plus l'erreur mais maintenant il me dit qu'il y en a une en ligne 38 du Dispatcher :

<?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 methode '.$this->request->action);
        }       
        call_user_func_array(array($controller,$this->request->action),$this->
        request->params);
        $controller->render($this->request->action);    
    }
    function error($message){
        $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);

    }

            }                   

?>

Cela doit encore etre une erreur de fermeture mais ?

le même cas pour Dispatcher.php,

<?php
    function error($message){
        $controller = new Controller($this->request);
        $controller->set('message',$message);   
        $controller->render('/errors/404');
        die();
    } // <-- n'oublies jamais la fermeture :p

Ah ok mais maintenant il revient sur l'erreur initiale donc celle pourtant sur la ligne 28:

require $file;

Mon code semble complet et correct et il revient sur cette erreur deja trouvée à la 28eme minutes....

Quel type d'erreur il s'affiche ?

Bonjour,

À mon avis tu n'as pas mis ton controlleur dans l'URL (exemple : localhost/pages/view).

Bonne chance. :p

Voici l'erreur :

j'ai tenté de taper : localhost/pages/view ou localhost/pages/view/index.php mais il me dit :
"Undefined variable"?

j'ai suivi le tuto à la lettre :

1 dossier www avec à l'interieur 5 dossier : controller-core-model-view-webroot et le htacess.

dans le dossier controller j'ai le pagescontroller.php
dans le dossier core , j'ai controller.php, dispatcher.php, includes.php, request.php et router.php
dans le dossier view 3 dossiers : errors,layout et pages avec :

dans le dossier errors, le fichier 404.php
dans le dossier layout, le fichier default.php
dans le dossiers pages, le fichier index.php

et enfin le dossier webroot ave à l'interieur :
dossier css,img et js ainsi que fichier index.php et le htacess.

Quand tu dis que je n'ai pas mis mon controller dans l'url? que veux-tu dire par là? je dois aller demander à wamp une adresse pour ne plus avoir ses erreurs?

En tout cas, merci de votre aide

neuillane

tu renommes le fichier Controller.php avec une C majuscule au début.

mon fichier Controller etait bien avec un C majuscule. Si wamp se lance normalement , il me donne ses erreurs :

si je lui demande http://localhost/pages/view/index.php, voila l'erreur :

Je pense demander la bonne adresse et je pense aussi que le code est complet alors ....
J'ai vu sur le forum que l'erreur etait frequente, surtout pour les debutants comme moi...

Dans ton Controller.php c'est $key non pas $keys.

public function set($key,$value=null){
        if(is_array($key)){
            $this->vars += $key;              
        }else{
            $this->vars$key] = $value;   
        } 
    }

ah oui c'est deja mieux. Plus d'erreur mais seulement une page blanche?
Bon je ne m'attendais pas à cela?

voici les erreur d'apache:

[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP Warning: require(C:\wamp\www\controller\Controller.php) <a href='function.require'>function.require</a>]: failed to open stream: No such file or directory in C:\wamp\www\core\Dispatcher.php on line 28
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP Stack trace:
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP 1. {main}() C:\wamp\www\webroot\index.php:0
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP 2. Dispatcher->__construct() C:\wamp\www\webroot\index.php:9
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP 3. Dispatcher->loadController() C:\wamp\www\core\Dispatcher.php:9
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP Fatal error: require() <a href='function.require'>function.require</a>]: Failed opening required 'C:\wamp\www\controller\Controller.php' (include_path='.;C:\php\pear') in C:\wamp\www\core\Dispatcher.php on line 28
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP Stack trace:
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP 1. {main}() C:\wamp\www\webroot\index.php:0
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP 2. Dispatcher->__construct() C:\wamp\www\webroot\index.php:9
[Mon Oct 22 08:09:19 2012] [error] [client 127.0.0.1] PHP 3. Dispatcher->loadController() C:\wamp\www\core\Dispatcher.php:9

je ne pense pas que ce soit normal d'avoir une pages blanche? Dans le tuto, on a fait un script mais rien n'apparait?

ENCORE MOI......

juste pour confirmation :

pagescontroller.php :

<?php
class pagescontroller extends Controller{
    function index(){

    }
}
?>

/view/pages/index.php:

div class="hero-unit">
    <h1>Bienvenue</h1>
    <p>c'est la page d'accueil</p>
</div>

index.php (dans dossier webroot):

<?php
define('webroot',dirname( __FILE__ ));
define('ROOT',dirname(webroot));
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'core');
define('BASE_URL',dirname(dirname($_SERVER'SCRIPT_NAME'])));
require CORE.DS.'includes.php';
new Dispatcher();
?>

Pourquoi rien n'apparait sur ma page meme lorsque je change la couleur daans le css, celle-ci n'apparait pas?

As-tu mis le controleur dans l'url ?

Veux-tu dire pâr là que j'ai appelé une mauvaise adresse comme => http://localhost/pages/view/index.php

ou qu'il faut que je deplace un des fichiers dans un autres?

http://localhost/ Controlleur / Action / Paramètres
aussi une autre chose, tu dois renommer ton class pagescontroller par P ages C ontroller avec les majuscules

j'ai tenté de faite

http://localhost/pages/view mais j'ai une page blanche

http://localhost/Controlleur/Action/Paramètres

correspond bien à
http://localhost/Controller/view/PagesController?

dés que j'aurai trouvé le bon lien ça devrait aller mais là je ne vois pas

J'ai essayé aussi le lien de Ramz1994 http://localhost/pages/view mais j'ai toujours une page blanche?

Personne n'a de solution à me proposer?
Peux pas continuer le tuto 3 alors...

on est bien d'accord que le code de router doit rester tel quel....?

<?php
class Router{
    /**
    *Permet de parser une url
    *§param $url Url à parser
    *§RETURN TABLEAU CONTENANT LES PARAMETRES                   
    **/
    static function parse($url,$request){
        $url = trim($url,'/');
        $params = explode('/',$url);
        $request->controller = $params[0];  
        $request->action =  isset($params[1]) ? $params[1]  : 'index';
        $request->params = array_slice($params,2);
        return true;

        }   
}
?>

bon, si je fais ce tuto => http://www.grafikart.fr/tutoriels/php/mvc-model-vue-controller-php-132
Le resultat devrait etre le meme mais si celui-ci fonctionne, pourrais reprendre le tuto faire son site de A à Z ?