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
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 :
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
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
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.