Bonjour,

J'ai suivi ce tuto :
Tutoriel vidéo PHP : Développer un site : Jour 2, La structure PHP

Et j'ai eu comme beaucoup de monde plusieurs erreurs lors du codage et j'ai trouvé une solution pour la plupart sur les différents posts.

En revanche j'ai une erreur qui persiste et je ne trouve pas de solution, j'ai vérifier plusieurs fois le code sur différents site dont on en parlait et il me semble bon ...

Voici les erreurs qui me sont retourné:

Warning: require(C:\wamp\www\Test\controller\controller.php): failed to open stream: No such file or directory in C:\wamp\www\Test\core\dispatcher.php on line 28
Call Stack
#   Time    Memory  Function    Location
1   0.0010  144328  {main}( )   ..\index.php:0
2   0.0090  167224  Dispatcher->__construct( )  ..\index.php:9
3   0.0090  168048  Dispatcher->loadController( )   ..\dispatcher.php:9
Fatal error: require(): Failed opening required 'C:\wamp\www\Test\controller\controller.php' (include_path='.;C:\php\pear') in C:\wamp\www\Test\core\dispatcher.php on line 28
Call Stack
#   Time    Memory  Function    Location
1   0.0020  144328  {main}( )   ..\index.php:0
2   0.0280  167224  Dispatcher->__construct( )  ..\index.php:9
3   0.0280  168048  Dispatcher->loadController( )   ..\dispatcher.php:9

Je précise que mon fichier controller.php n'a pas de majuscule.

Voici le code du fichier CONTROLLER.PHP:

<?php
class Controller{
    public $request;
    private $vars = array(); //Variables qu'on veut faire passer à la vue
    public $layout = 'default';
    private $rendered   = false; //Variables qu'on veut faire passer à la vue

    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 += $key;
        }else{
            $this->vars$key] = $value;
        }
    }
}
?>

Et celui du fichier DISPATCHER.PHP:

<?php
class Dispatcher{

    var $request;
    function __construct(){
        $this->request = new Request(); //Initialisation de la var $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;
        $controller = new $name($this->request);
        return new $name($this->request);  
    }
}
?>

Merci pour votre aide à venir.

Ludo

3 réponses


il semblerai si je lis bien que ton prb vienne de ton dispatcher ou d'un fichier qui charge ton dispatcheur.

Le fichier php qui gère ton include path à une erreur

(include_path='.;C:\php\pear')

si tu regardes bien devant ton c:\ tu trouve les caractère " . " et " ; "

dans ton dispatcheur tu à cette ligne

$file = ROOT.DS.'controller'.DS.$name.'.php';

qui est la ligne 27

et en 28 tu fait ton require.

je ne connais pas cette écriture, mais j'aurai tendance à penser que dans ces 2 lignes il y a un prb

$name = ucfirst($this->request->controller).'controller';
$file = ROOT.DS.'controller'.DS.$name.'.php';

.

désolé de ne pouvoir t'aider plus.

par contre pense à mettre tes codes entre balise code, c'est doublement pratique:
1-pour nous car il y a les numéro de lignes et les couleurs syntaxique
2-pour toi car il y a de grande chance que n'utilise pas ces couleurs et donc voit la une erreur de syntaxe plus vite.

@+ et bon courage

Désolé j'avais pas pensé aux balises de code ... autant pour moi ...

Sinon merci pour ton aide, c'est toujours utile pour moi .

Vais creuser dans cette direction et je reviens dès que j'ai une solution.

[EDIT]

J'ai mis des Echo par-ci par-là dans le fichier DISPATCHER.PHP et voilà ce qu'il me retourne.

Je précise que l'URL tapée est:
http://localhost/Test/view/

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

Pour le

echo $name;

, il me retourne:
Viewcontroller

Pour le

echo $file;

, il me retourne:
C:\wamp\www\Test\controller\Viewcontroller.php

Voilà, je continue mes recherches sur ce bout de code :

$name = ucfirst($this->request->controller) . 'controller';

Je ne parviens pas à trouver de solution par rapport à mon problème.

Voici la structure de mon dossier TEST :

Structure

Voici toutes les pages que j'ai:

includes.php :

?<?php
require 'Request.php';
require 'Router.php';
require 'Controller.php';
require 'Dispatcher.php';
?>

Dispatcher.php :

?<?php
class Dispatcher{

    var $request;
    function __construct(){
        $this->request = new Request(); //Initialisation de la var $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(){
        //if (isset($_SERVER'PATH_INFO'])) {
            $name = ucfirst($this->request->controller) . 'controller';
            $file = ROOT . DS . 'controller' . DS . $name . '.php';
            require $file;
            $controller = new $name($this->request);
            return new $name($this->request);
        //}
    }
}
?>

Controller.php :

??<?php
class Controller{
    public $request;
        private $vars = array(); //Variables qu'on veut faire passer à la vue
        public $layout = 'default';
        private $rendered   = false; //Variables qu'on veut faire passer à la vue

    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 += $key;
        }else{
            $this->vars$key] = $value;
        }
    }
}
?>

PagesController.php :

??<?php
class PagesController extends Controller{
    function index(){
        $this->render('index');
    }
}
?>

Router.php :

?<?php
class Router{
    //Permet de parser une url
    //@param $url Url à parser
    //@return tableau contenant les paramètres
    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;
    }
}
?>

Request.php :

??<?php
class Request{

    public $url; //URL appelée par l'utilisateur
    function __construct(){
        //$this->url = $_SERVER'PATH_INFO'];
        $this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/'; 
    }
}
?>

index.php :

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

Et quand je mets en URL

http://localhost/Test/

J'ai cette erreur :

( ! ) Warning: require(C:\wamp\www\Test\controller\controller.php): failed to open stream: No such file or directory in C:\wamp\www\Test\core\Dispatcher.php on line 29
Call Stack
#   Time    Memory  Function    Location
1   0.0020  143976  {main}( )   ..\index.php:0
2   0.0120  166704  Dispatcher->__construct( )  ..\index.php:9
3   0.0120  167520  Dispatcher->loadController( )   ..\Dispatcher.php:9

( ! ) Fatal error: require(): Failed opening required 'C:\wamp\www\Test\controller\controller.php' (include_path='.;C:\php\pear') in C:\wamp\www\Test\core\Dispatcher.php on line 29
Call Stack
#   Time    Memory  Function    Location
1   0.0020  143976  {main}( )   ..\index.php:0
2   0.0120  166704  Dispatcher->__construct( )  ..\index.php:9
3   0.0120  167520  Dispatcher->loadController( )   ..\Dispatcher.php:9

Et quand je mets en URL

http://localhost/Test/view/pages (là ou le fichier index.php (l'accueil du site) se trouve), j'ai ça d'afficher :

( ! ) Warning: require(C:\wamp\www\Test\controller\Viewcontroller.php): failed to open stream: No such file or directory in C:\wamp\www\Test\core\Dispatcher.php on line 29
Call Stack
#   Time    Memory  Function    Location
1   0.0030  144664  {main}( )   ..\index.php:0
2   0.0140  167392  Dispatcher->__construct( )  ..\index.php:9
3   0.0150  168304  Dispatcher->loadController( )   ..\Dispatcher.php:9

( ! ) Fatal error: require(): Failed opening required 'C:\wamp\www\Test\controller\Viewcontroller.php' (include_path='.;C:\php\pear') in C:\wamp\www\Test\core\Dispatcher.php on line 29
Call Stack
#   Time    Memory  Function    Location
1   0.0030  144664  {main}( )   ..\index.php:0
2   0.0140  167392  Dispatcher->__construct( )  ..\index.php:9
3   0.0150  168304  Dispatcher->loadController( )   ..\Dispatcher.php:9

Et quand je mets en URL

http://localhost/Test/pages/

J'obtiens ça :

Bienvenue
C'est la page d'accueil du CESS

Et quand je mets en URL

http://localhost/Test/pages/core

J'obtiens ça :

Page introuvable
Le controller pages n'a pas de méthode core

Donc je ne dois vraiment pas être loin du tout mais je ne trouve pas l'erreur ...

Si qqchose vous saute aux yeux, merci de me le signaler svp.

Bonne journée à tous.