salut
J'ai suivi ce tuto :
Tutoriel vidéo PHP : Développer un site : Jour 2, La structure PHP
Voici les erreurs qui me sont retourné:
ERROR1: require(C:\wamp\www\Tuto\Site\controller\PagesController.php): failed to open stream: No such file or directory in C:\wamp\www\Tuto\Site\core\Dispatcher.php on line 21

ERROR2: Fatal error: require(): Failed opening required 'C:\wamp\www\Tuto\Site\controller\PagesController.php' (include_path='.;C:\php\pear') in C:\wamp\www\Tuto\Site\core\Dispatcher.php on line 21

ET voilà mon code :

15 réponses


yoss
Auteur

Dispatcher.php

<?php
class Dispatcher {
    var $request; //créer une variable

  function __construct(){

   $this->request = new Request(); /*initialiser cette variable*/

    //echo $this->request->url; /*ça sert à récupérer l'url*/

    Router::parse($this->request->url, $this->request); //parser mon url // les :: c parce que router est une classe statique qui va étre utilisé tt le long du projet donc son appel sera de cette manière pas nécessairement de new router()) 
    /*print_r($this->request);*/

    $controller = $this->LoadController(); /*charger le controlleur*/
    $controller->view();
    }
   function LoadController(){
    $name = ucfirst($this->request->controller).'Controller';
    $file = ROOT.DS.'controller'.DS.$name.'.php' ;
  require $file;
    return new $name($this->request) ;

   }

}

?>
yoss
Auteur

Router.php

<?php 
class Router{

    /* cette fonction permet de parser un url

    * return: tableau contenant les params */

    static function parse($url,$request){
        $url= trim($url,'/'); /* cette fnct permet par défaut d'enlever les espaces mais içi elle devra enlever les / */
        $params = explode('/',$url);
       $request->controller = $params[0];
       $request-> action = isset($params[1]) ? $params[1] :'index';
      $request-> params = array_slice($params,2); /*pour enlever "tuto/site" de l'url */

        return true;

    }

}
?>
yoss
Auteur

includes.php

<?php
require'Request.php' ; //il faut charger la requete avant le dispatcher pour qu'on puisse voir les action
require'Router.php' ;
require'Controller.php' ;
require'Dispatcher.php' ; //charger le dispatcher
?>
yoss
Auteur

Request.php

<?php
class Request {
  public $url; //url appelé par utilisateur

  function __construct(){
    $this->url = $_SERVER'PATH_INFO'];

      }

}

?>
yoss
Auteur

Controller.php

<?php
class Controller {

}
?>
yoss
Auteur

PagesControllers.php

<?php 
class PagesControllers extends Controller{
    function view(){

        echo 'hello';
    }

}
yoss
Auteur

Mon arborescence est :
Tuto
Site
controller -> PagesControllers.php
core -> Controller.php + Dispatcher.php + Router.php + Request.php + includes.php

model
view
webroot
css -> style.css
img
js
index.php
.htaccess

.htaccess

yoss
Auteur

je l'ai remplacer mais même problème :(

yoss
Auteur

c'est bon j'ai changé PagesControllers par PagesController et ça marche merci beaucoup
Mais j'ai encore rencontré un autre probléme :'(

yoss
Auteur

Voilà l'erreur
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'PagesController' does not have a method 'index' in C:\wamp\www\Tuto\Site\core\Dispatcher.php on line 19

yoss
Auteur

non c'est vérifier avec le "s"

yoss
Auteur
<?php
class Dispatcher {
    var $request; //créer une variable

  function __construct(){

   $this->request = new Request(); /*initialiser cette variable*/

    //echo $this->request->url; /*ça sert à récupérer l'url*/

    Router::parse($this->request->url, $this->request);  
     $controller = $this->LoadController() ; /*charger le controlleur*/

    call_user_func_array(array($controller, $this->request->action), $this->request->params);

    }

   function LoadController(){
    $name = ucfirst($this->request->controller).'Controller'; 
    $file = ROOT.DS.'controller'.DS.$name.'.php' ;
    require $file;
   return new $name($this->request) ;
}
}

?>
yoss
Auteur

j'ai rien changé dans les classes précédentes que au niveau de PagesController.php et voilà le code

<?php 
class PagesController extends Controller{

    function view($nom){
        echo 'vous avez demandé la page :' .$nom ;

    }

}
?>
yoss
Auteur

et pour me bien comprendre je suit le tuto "Tutoriel PHP _ Développer un site _ Jour 2, La structure PHP" du Grafikart à partir du 30min merci

salut, j'ai le meme probleme sachant que j'ai suivi les memes etapes avec le tuto.
as tu trouvé la solution ?