Bonjour,
merci pour les tutos proposés (et pour pas cher)
mais
ils ont l'air quand même pas mal bugués ou destinés à une configuration bien précise.
Il suffit de taper le message d'erreur sur google pour se rendre compte que je ne suis pas le seul à rencontrer les problèmes.
J'ai essayé avec plusieurs serveurs WAMP, EasyPHP, Uniserver et serveur perso...
Et bien c'est pas joli !
Avec mes sources ou les sources téléchargeables.
Je suis déçu de m'être lancé dans ce tutoriel pour me rendre compte que même les sources proposées ne fonctionnent pas directement...

Premièrement le problème de PATH_INFO résolu en utilisant getenv('PATH_INFO');
Ensuite dans la focntion function loadController() le $file n'était pas le bon pour ma part et je ne sais plus quelle bidouille j'ai fais pour résoudre le problème en tout cas ça n'était pas dans les sources...
Enfin "Fatal error: Cannot redeclare class Controller in ...\core\Controller.php on line xx".

Donc mes questions :
sur quel environnement, la personne qui a fait les vidéos, travaille-t-elle ?
Quelles configurations a-t-il fait afin que ça fonctionne du premier coup sans avoir à bidouille toutes les 10min de vidéo ?

Existe-t-il un autre tutoriel sans bug sur les MVC ?

Merci =)

34 réponses


Sm@il
Réponse acceptée

Le problème ne vient pas du code de grafikart, malgré que pour ma part j'ai pas télécharger le source mais que j'ai du tout réécrire. bref il me semble que j'ai eu se soucis là à un moment donnée et j'ai ajouté un else là ou normalement on a pas besoin d'ajouter un else:
Fichier Dispatcher.php

if(!in_array($this->request->action, array_diff(get_class_methods($controller), get_class_methods('Controller') ))){
            $this->error('Le controller '.$this->request->controller.' n\'a pas de methode '.$this->request->action);
        }else{
        call_user_func_array(array($controller, $this->request->action),$this->request->params); 
        $controller->render($this->request->action);
        }

et ben du coup ça a marcher et j'ai plus cette erreurs là.

ou bien y a une erreur dans la fonction loadController car je vois qu'il essai d'ouvrir controller/Controller.php alors que normalement ça devrait être controller/PagesController.php

function loadController(){
        $name = ucfirst($this->request->controller).'Controller';// $name=PagesController
        $file = ROOT.DS.'controller'.DS.$name.'.php';// $file = ***\www\*** \controller\PagesController.php
        require $file;
        return new $name($this->request);
    }

mec continu avec les cours de grafikart et oublie pas que se genre d’erreurs va t'aider à t'améliorer car en détectant les erreurs tu vas développer un instinct de programmeur.

See ya!

Hum hum ! Je trouve un peu culotté de venir affirmer que le tuto est buggé. Je l'ai regardé de A à Z pour dépanner des forumeurs et j'ai téléchargé les sources tout marche parfaitement a partir du moment où c'est la dernière version de PHP5 et d'apache2. De plus, EASY PHP et autres pseudo webserver proposent un php.ini déjà paramétré ou de nombreux paramètres sont modifiés. Il faut par exemple s'assurer du niveau d'exigence de PHP. Perso il est en "STRICT" sur ma debian et les sources fonctionnent parfaitement sur tous mes serveurs dédiés. Le tuto a comme seul prérequis d'avoir l'url rewriting activé... Si tout celà est réunion ça fonctionne très bien !

jeyt
Auteur

Bonjour et merci pour ta réponse revlam.
Culotté ou pas, il est avéré que ça ne fonctionne pas sans mal et que peut-être un petit mot en intro à ce sujet aurait été intéressant. Ou alors il est déjà présent et je ne l'ai pas remarqué et dans ce cas je m'excuse pour ce que j'ai dit.
Je testerais directement les sources sur un serveur dédié et s'il n'y a pas d'erreur sur les sources alors je m'en servirais pour apprendre le tuto. Sinon je me pencherais sur un autre tuto.

A suivre...

jeyt
Auteur

Bonjour,
aujourd'hui
je dézippe les sources du jour 2 que j'avais récupéré histoire d'avoir les vraies sources sans modifications de ma part.

Sous OVH => PATH_INFO
passons ce problème avec la solution que j'avais trouvé

je me retrouve avec 2 messages :

Warning: require( ****/www/**** /controller/Controller.php) [function.require]: failed to open stream: No such file or directory in ****/www/**** /core/Dispatcher.php on line 39
Fatal error: require() [function.require]: Failed opening required ' ****/www/**** /controller/Controller.php' (include_path='.:/usr/local/lib/php') in ****/www/**** /core/Dispatcher.php on line 39

De bonne foi j'essaie avec le jour 3 en me disant que peut-être qu'à la fin de la vidéo (malgré ce que l'on voit) le site n'est pas encore finalisé pour afficher quoi que ce soit.
Et bien c'est la même.

Donc je suis peut-être culotté d'affirmer que le tuto est buggé mais le bug est bien présent. Qui plus est sur un serveur dédié comme OVH qui n'a pas vraiment une mauvaise réputation =)
Donc merci pour ce tuto que l'on devrait appeler "Développer un site de B à Z" car le reste, je n'en doute pas, est de bonne qualité.

Moi j'ai recopié tout le code au fur et à mesure. Je n'ai téléchargé aucune source et sous Mamp tout fonctionne je n'ai aucun bug

jeyt
Auteur

Alors je vais essayer de suite et installer Mamp. Sachant qu'un jour ou l'autre je passerais sous OVH et donc qu'il faudra que je modifie mes pages pour que ça fonctionne...

As-tu bien l'url rewriting d'activés ?

Avec Wamp ou EasyPHP, tous va très bien avec ces tutos et les sources de "Grafikart - Sources Tutoriel Développer un site - Jour X"

jeyt
Auteur

Bonjour, oui l'url rewriting est activé.
neocorp va falloir m'expliquer comment, avec les dernières versions de wamp et easyphp, sur 2 PC différents et 2 OS différents
j'ai le même message d'erreur...

Bah c'est que tu dois mal faire quelque chose !!!!! Vu tes erreurs, je ne suis pas sur que l'UrlRewriting fonctionne pour preuve le serveur web ne trouve pas les fichiers ROOT

jeyt
Auteur

Si si l'urlrewriting fonctionne, d'ailleurs avant l'histoire du PATH_INFO dans la vidéo tout fonctionnait. Et puis sous OVH il est activé par défaut l'urlrewriting.

Si tu le dit... Pour avoir dépanné 4-5 utilisateurs ici même souvent c'était l'url rewriting qui n'était pas activé ou avait un comportement bizarre. En tout cas une chose est sure, le soucis vient de chez toi :)

jeyt
Auteur

Alors je fais appel aux utilisateurs de OVH en compte PRO =)
Peut-être que les sources que j'ai récupéré sont corrompues.

jeyt
Auteur

Merci beaucoup beaucoup Sm@il !

Merci Grafikart pour ce superbe tutoriel qui m'a permis d'approfondir mes connaissances en MVC !

Bonsoir j'ai le même problème avec mon code j'ai bien ajouté dans apache le module rewrite mais cela ne fonctionne pas voci les erreurs que j'ai si vous pouvez m'aider merci d'avance

( ! ) Notice: Undefined index: PATH_INFO in C:\wamp\www\Site\core\Request.php on line 8
Call Stack
#   Time    Memory  Function    Location
1   0.0036  680224  {main}( )   ..\index.php:0
2   0.0074  735000  Dispatcher->__construct( )  ..\index.php:9
3   0.0074  735336  Request->__construct( ) ..\Dispatcher.php:15
( ! ) Warning: require(C:\wamp\www\Site\controller\Controller.php) [function.require]: failed to open stream: No such file or directory in C:\wamp\www\Site\core\Dispatcher.php on line 42
Call Stack
#   Time    Memory  Function    Location
1   0.0036  680224  {main}( )   ..\index.php:0
2   0.0074  735000  Dispatcher->__construct( )  ..\index.php:9
3   0.0077  735976  Dispatcher->loadController( )   ..\Dispatcher.php:17
( ! ) Fatal error: require() [function.require]: Failed opening required 'C:\wamp\www\Site\controller\Controller.php' (include_path='.;C:\php\pear') in C:\wamp\www\Site\core\Dispatcher.php on line 42
Call Stack
#   Time    Memory  Function    Location
1   0.0036  680224  {main}( )   ..\index.php:0
2   0.0074  735000  Dispatcher->__construct( )  ..\index.php:9
3   0.0077  735976  Dispatcher->loadController( )   ..\Dispatcher.php:17

Regarde sur le forum y a des solutions pour les PATH_INFO qui ne sont pas définit par le serveur

Bonjour j'ai recherché toute la nuit mais mon code bug toujours j'ai bien mis les fichiers en ordre le php.ini et httpd.conf aussi je n'ai plus d'erreur PATH_INFO car j'ai changé suivant les conseil du site mais j'ai toujours le problème avec le loadController(), si vous pouvez m'aidez merci d'avance

Met le code de ta page dispatcher stp

Oui voilà j'espère que cela pourra t'éclairer sur mon problème
Dispatcher.php

<?php
/**
* Dispatcher
* Permet de charger le controller en fonction de la requête utilisateur
**/
class Dispatcher{

    var $request;   // Object Reques
    /**
    * Fonction principale du dispatcher
    * Charge le controller en fonction du routing
    **/
    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);

    }
    /**
    * Permet de générer une page d'erreur en cas de problème au niveau du routing (page inexistante)
    **/
    function error($message){
        header("HTTP/1.0 404 Not Found");
        $controller = new Controller($this->request); 
        $controller->set('message',$message); 
        $controller->render('/errors/404');
        die(); 
    }
    /**
    * Permet de charger le controller en fonction de la requête utilisateur
    **/
    function loadController(){
        $name = ucfirst($this->request->controller).'Controller'; 
        $file = ROOT.DS.'controller'.DS.$name.'.php'; 
        require $file; 
        return new $name($this->request);  
    }

}

Si tu met un var_dump($this->request); juste avant de faire $controller = $this->loadController(); tu obtiens quoi?

bonsoir , j'ai à nouveau suivi la vidéo pas à pas maintenant j'arrive sur tous les index à part dans le dossier webroot là on me met cette erreur:

Parse error: syntax error, unexpected T_PUBLIC in C:\wamp\www\Site\core\Controller.php on line 46
Call Stack
#   Time    Memory  Function    Location
1   0.0013  674296  {main}( )   ..\index.php:0
2   0.0027  677280  require( 'C:\wamp\www\Site\core\includes.php' ) ..\index.php:7

sinon il y a aussi que ma page ne se met pas avec le code javaScript donc j'ai juste le fichier avec le code html pourquoi?
pour résoudre mon premier problème j'ai du changer dans le fichier .htaccess

RewriteRule (.*)webroot/$1 [L]

coller webroot à la parenthèse pour avoir l'index et si je ne colle pas j'ai la même erreur qu'avant! merci déjà pour toutes vos réponses , j'aimerais aller plus loin j'ai déjà fait un site avant mais sans utiliser mvc

La l'erreur te dit que tu as un problème dans ton fichier Controller.php à la ligne 46 mais qu'à tu à cette ligne?

ça j'avais quand même compris voici le code du fichier controller.php

<?php 
/**
* Controller
**/
class Controller{

    public $request; // Objet Request 
    private $vars = array();    // Variables à passer à la vue
    public $layout = 'default'; // Layout à utiliser pour rendre la vue
    private $rendered = false; // Si le rendu a été fait ou pas ?
    /**
    * Constructeur
    * @param $request Objet request de notre application
    **/
    function __construct($request){
        $this->request = $request; // On stock la request dans l'instance
    }

    /**
    * Permet de rendre une vue
    * @param $view Fichier à rendre (chemin depuis view ou nom de la vue) 
    **/
    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; 
    }

    /**
    * Permet de passer une ou plusieurs variable à la vue
    * @param $key nom de la variable OU tableau de variables
    * @param $value Valeur de la variable
    **/
    public function set($key,$value=null){// c'est celle-ci la ligne 46!
        if(is_array($key)){
            $this->vars += $key; 
        }else{
            $this->vars$key] = $value; 
        }
    }

}
?>

Le problème vient de la ligne 32 car tu as commenter le } et pour lui tu la referme à la fin mais tu referme pas la function d'où le bug

merci c'est quand j'ai refait le code j'ai du l'oublier mais cela ne change pas mon problème il mais toujours impossible de afficher la page index.php du répertoire webroot j'ai à nouveau le problème avec le path_info et la fonction loadcontroller sinon si je tape direct le chemin pour afficher la page html dans la ligne de commande j'y arrive mais je n'ai pas la mise en page prévue juste le code html il ne prend pas compte du javaScript peux tu m'aiguiller merci d'avance

Quand tu tape http://localhost:8888/blog/view/1 tu obtiens quoi en fesant un var_dump() de $this->request dans ton dispatcher

si c'est pour la mise en page c'est régler j'ai changé le lien apparemment celui du tuto ne fonctionnait pas chez moi maintenant j'ai une vue plus agréable à voir, mais je n'arrive toujours pas à aller sur le fichier index.php de webroot c'est le seul les autre j'y arrive !

Et pourquoi tu veux aller sur le fichier index.php de webroot?

je ne sais pas je croyais qu'on devait pouvoir aller sur tous les index , je suis débutant et dans les autres tuto je n'employais pas mvc et je passait toujours par les pages index, si il n'y a pas d'utilité ici tant mieux je peux continuer avec le reste du tuto et passer au jour 3?

Oui tu peux car tu n'as pas besoin de passer par l'index il le fait tout seul

merci pour tous tes réponses , j'espère qu'on gardera contact au cas ou j'ai d'autres problèmes dans le futur car apparemment il y en a quand on est sur un hébergeur aussi avec info_path mais pour le moment je travail toujours en local, encore merci a+

La prochaine ouvre un sujet au lieu de poster à la suite d'un autre

ok pas de problème