Bonjour à vous, Comme le titre l'explique si bien, j'ai des problèmes dans le tutoriel : Développer un site : Jour 2. N'ayant que très peu de compétence en la matière, je lance une appelle d'aide. Cela dit, j'ai quelques doutes concernant le problème. Peut-être un problème avec [PATH_INFO] ou peut-être une mauvais écriture du code de ma part. Cela dit voila lorsque je fais print_r($_SERVER). Vous pourrez remarquer que [PATH_INFO] n'y ai pas. [code]Array ( [HTTP_HOST] => ramz.no-ip.org [HTTP_CONNECTION] => keep-alive [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch [HTTP_ACCEPT_LANGUAGE] => fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.3 [HTTP_COOKIE] => cP.cPM9s=; cP.cPM8s=; cP.cPM7s=; cP.cPM6s=; cP.cPM5s=; cP.cPM4s=; cP.cPM3s=rgb(0| 0| 71); cP.cPM2s=rgb(142| 173| 71); cP.cPM1s=rgb(255|24|255); size=4; CP.mode=B; __utma=197766060.1432707412.1344655785.1344655785.1344655785.1; __utmz=197766060.1344655785.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) [PATH] => C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMD APP\bin\x86;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\Druide\Antidote 7\Programmes32;C:\Program Files (x86)\Druide\Antidote 7\Programmes64;C:\Program Files (x86)\Common Files\HP\Digital Imaging\bin;C:\Program Files (x86)\HP\Digital Imaging\bin\;C:\Program Files (x86)\HP\Digital Imaging\bin\Qt\Qt 4.3.3;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files\TortoiseGit\bin; [SystemRoot] => C:\windows [COMSPEC] => C:\windows\system32\cmd.exe [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC [WINDIR] => C:\windows [SERVER_SIGNATURE] => [SERVER_SOFTWARE] => Apache/2.4.2 (Win64) PHP/5.4.3 [SERVER_NAME] => ramz.no-ip.org [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => C:/wamp/www/ [REQUEST_SCHEME] => http [CONTEXT_PREFIX] => [CONTEXT_DOCUMENT_ROOT] => C:/wamp/www/ [SERVER_ADMIN] => admin@localhost [SCRIPT_FILENAME] => C:/wamp/www/test.php [REMOTE_PORT] => 14592 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => [REQUEST_URI] => /TEST.php [SCRIPT_NAME] => /TEST.php [PHP_SELF] => /TEST.php [REQUEST_TIME_FLOAT] => 1344996841.915 [REQUEST_TIME] => 1344996841 )[/code] Ensuite, je vais mettre la structure actuelle des pages et code de chaque page : Je tiens à préciser que : J'ai activé le service apache Rewrite_module cgi.fix_pathinfo=1 : placé à 1 (par défaut) AcceptPathInfo On : ajouté ** Les deux codes d'erreur : [code]Warning: require(C:\wamp\www\Application\Controller\Controller.php): failed to open stream: No such file or directory in C:\wamp\www\Application\core\Dispatcher.php on line 21[/code] [code]Fatal error: require(): Failed opening required 'C:\wamp\www\Application\Controller\Controller.php' (include_path='.;C:\php\pear') in C:\wamp\www\Application\core\Dispatcher.php on line 21[/code] **Structure** [img]https://dl.dropbox.com/u/90872635/Structure.PNG[/img] **PagesController.php** [code]<?php class PagesController extends Controller
{
function view($nom)
{
$this->set(array( 'phrase' => 'salut', 'nom' => 'machin' )); $this->render('index'); } } ?> [/code] **Controller.php** [code]<?php class Controller
{
public $request;
public $vars = array();

function __construct($request)
{
    $this->request = $request; } public function render($view) { extract($this->vars); $view = ROOT.DS.'view'.DS.$this->request->Controller.ds.$view.'.php'; require($view); } public function set($key,$value=null) { if(is\_array($key)) { $this->vars += $key; } else { $this->vars[$key] = $value; } } } ?> [/code] \*\*Dispatcher.php\*\* [code]<?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 méthode '.$this->request->action); } call\_user\_func\_array(array($controller,$this->request->action),$this->request->params); $controller->render($this->request->action); } function loadController() { $name = ucfirst($this->request->Controller).'Controller'; $file = ROOT.DS.'Controller'.DS.$name.'.php'; require $file; return new $name($this->request); } } ?> [/code] \*\*Includes.php\*\* [code]<?php require 'Dispatcher.php';

require 'Request.php';
require 'Router.php';
require 'Controller.php';
?>[/code] **Request.php** [code]<?php class Request
{
public $url; // URL appellé par l'utilisateur

function __construct()
{
    $this->url = isset($\_SERVER['PATH\_INFO'])?$\_SERVER['PATH\_INFO']:'/'; } } ?> [/code] \*\*Router.php\*\* [code]<?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; } } ?> [/code] **Index.php*\
    [code]<?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();

// Information relative à $_SERVER
/ Actuellement désactivé
echo"<pre>"; print_r($_SERVER); echo""; */ ?> [/code] **.htacess** [code] RewriteEngine On RewriteRule (.*) /Application/webroot/$1 [L] [/code] **.htacess** du webroot [code] RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.\
) /Application/index.php/$1 [L] [/code] Voila, en espérant que le problème soit mineur et qui je puisse continuer le reste de la vidéo. :) Cordialement, Ramz.

25 réponses


Ramz1994
Auteur

Bonsoir,

Personne aurait une solution sous la main? D'ici à ce qu'une réponse soit donnée, je vais repasser le tutoriel.

Merci à vous et bonne soirée.

Cordialement,
Ramz.

Si tu n'a pas l'index Path_INFO (c'est possible sur certain serveur) utilise une autre variable (genre REQUEST_URI)

Ramz1994
Auteur

Bonjour Grafikart,

J'ai donc changé la ligne dans Request.php ce qui résulte à ceci :

Warning: require_once(C:\wamp\www\Application\Controller\ApplicationController.php): failed to open stream: No such file or directory in C:\wamp\www\Application\core\Dispatcher.php on line 31

Fatal error: require_once(): Failed opening required 'C:\wamp\www\Application\Controller\ApplicationController.php' (include_path='.;C:\php\pear') in C:\wamp\www\Application\core\Dispatcher.php on line 31

Ce que j'en comprend c'est que REQUEST_URI m'amène jusqu'à l'application ([REQUEST_URI] => /Application/)

Il y a aussi une chose qui me donne des maux de tête mais c'est probablement à cause de mon inexpérience dans le domaine. Pourquoi require dans le dossier Controller le fichier Controller.php , puisqu'il est dans le dossier core? Il y a probablement une raison à cela mais je ne la connais pas. Quoi qu'il en soit, cela ne fonctionne pas lorsqu'on met core à la place de Controller ou PagesController à la place de Controller, rien ne se passe.

Merci à vous Grafikart pour cette réponse.

Cordialement,
Ramz.

Ramz1994
Auteur

Petite précision :

Lorsque je fais ceci, j'ai la même erreur que tout à l'heure. Je pense qu'on peut conclure que ce n'est pas PATH_INFO ?

function loadController()
    {
        $name = 'Controller'.DS.'Controller';
        $file = ROOT.DS.$name.'.php';
        require_once $file;
        return new $name($this->request);
    }

À bientôt,

Cordialement,
Ramz

Ramz1994
Auteur

Bonjour,

J'ai recommencé le tutoriel mais j'ai maintenant une erreur supplémentaire :

Je bloque à 29:46 pour les mêmes raisons.

Notice: Undefined property: Request::$controller in C:\wamp\www\test\core\Dispatcher.php on line 16

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 18

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 18

Voici mes fichiers utilisés :

Dispatcher.php

<?php
class Dispatcher
{
    var $request;
    function __construct()
    {
        $this->request = new Request();
        Router::parse($this->request->url, $this->request);
        $controller = $this->loadController();
        $controller->view;
    }
    function loadController()
    {
        $name = ucfirst($this->request->controller).'Controller';
        $file = ROOT.DS.'controller'.DS.$name.'.php';
        require $file;
        return new $name($this->request);
    }
}
?>

Request.php

<?php
class Request
{
    public $url; // URL appelé par l'utilisateur
    function __construct()
    {
        $this->url = $_SERVER'REQUEST_URI'];
    }
}
?>

Routeur.php

<?php
class Router
{
    /* 
     * Permet de parser une url
     * @param $url URL à parler
     * @return talbeau 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;
    }
}
?>

webroot/index.php

<?php
// Définition des constantes 
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_once CORE.DS.'includes.php';
new Dispatcher();
?>

Les autres fichiers sont soit vide ou inutile.

À bientôt et je ne serais que vous remercier de trouver la solution. :)

Cordialement,
Ramz.

Je pense que tes .htaccess bug, tu as activer le mod rewrite ?

Ramz1994
Auteur

Oui Aureroy. :)

Vérifie dans ton Router que $params[0] vaut quelque chose

Ramz1994
Auteur

http://ramz.no-ip.org/test/test\_action/test\_params

Array ( [0] => test [1] => test_action [2] => test_params )

Voila, je pense que cette partie fonctionne. :D

Merci pour ta réponse.

Cordialement,
Ramz.

Il essaie d'inclure controller/Controller.php
Donc dans ton loadControllere(), $name est mal configuré. vérifié que $this->request->controller valle quelque chose dans ton loadController

Et d'ailleurs tu as écrit .htacess 2 fois, c'est .htaccess avec 2 c.

C'est une erreur quand tu as recopié ici ou tu as réèllement écrit .htacess ?

Ramz1994
Auteur

Ah oui, effectivement c'est une erreur lorsque j'ai réécris ici. De toute manière, ils ne redirigeraient pas vers l'erreur si le .HTACCESS ne fonctionnerait pas. :p

Quand tu essaies d'aller sur localhost/pages il ne trouve pas le controller PagesController dans le dossier controller ?

Ramz1994
Auteur

Si je remonte à ce que j'avais fais plus haut :

http://localhost/web-application/view/Pages/index.php (j'ai changé le nom dans HTACCESS tout ça)

Warning: require_once(C:\wamp\www\web-application\Controller\ViewController.php): failed to open stream: No such file or directory in C:\wamp\www\web-application\core\Dispatcher.php on line 31

Fatal error: require_once(): Failed opening required 'C:\wamp\www\web-application\Controller\ViewController.php' (include_path='.;C:\php\pear') in C:\wamp\www\web-application\core\Dispatcher.php on line 31

Cela dit, ce sont les mêmes erreurs. Tout fonctionne bien jusqu'à ce quand que j'arrive à ceci :

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

C'est à partir de ce moment que j'ai les erreurs.

Merci encore pour vos réponses.

Cordialement,
Ramz.

Ramz1994
Auteur

Aucune solution?

Il cherche le View controller, donc à la place de view dans ton url, mets pages

Non, en faite quand il fait require ROOT.DS.'controller'.DS.$name.'.php'; $name est mal configuré, il n'a pas les bons paramètres dans la fonction parse ($params)

Oui j'ai testé le tuto j'ai exactement le même problème je cherche encore la solution si je la trouve je te la partage :)

Alors j'ai avancé ,

sur cette ligne

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

il ne faut pas mettre Controller mais controller en minuscule.

sur celle ci dans Controller.php

$view = ROOT.DS.'view'.DS.$this->request->Controller.ds.$view.'.php';

met

$view = ROOT.DS.'view'.DS.$this->request->Controller.DS.$view.'.php';

.

en revanche il ne me récupère pas le message

et j'ai du commenter ceci dans le dispatcher.php

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); 
        }

car ca me revoyait une erreur undefine methode error.

voila j'ia bien avancer si j'arrive a afficher la message je te tien au courant

Il ne trouve pas la bonne action, tu dois donc vérifier que $this->request->action soit bien l'action créé dans ton controller et vérifie aussi que $this->request->controller sois le bon controller

Salut, mois aussi j'ai un problème avec les erreurs ^^
Pour la page 404 par ex. il m'est impossible de la visualiser.

J'ai même payer pour avoir le code en me disant que j'ai dut me tromper dans les syntaxe ou quoi... , mais même avec la source préium
il ne m'affiche pas la page 404 ...

Donc sa viendrais du .ht ?

ps: je suis sur Wamps

Merci d'avance

Merci Aureroy mais tout ça j'ai déjà vérifier en fait il m'affiche bien la vue puisqu'il affiche les messages ecrit en dur dedans "bienvenue sur mon site" etc

sauf que sur la phrase " le message est:" $phrase il ne m'affiche pas le contenu de la phrase mais je vais trouver quand à la methode error je pense que c plus du a mon config server.

J'ai réussi a afficher le message en activant register_globals

Salut ! J'ai également le même problème que toi. De mon coté, je pense qu'il ne s'agit pas d'un souci au niveau du composant de routing ni des htaccess mais de la variable $_SERVER'SCRIPT_NAME'] utilisé pour générer le $this->url dans le composant Request.

Tout marche bien lorsque je travaille depuis l'url http://localhost/tuto, mais si je lance le script depuis un vhost comme par exemple http://tuto.localhost/, tout se casse au niveau de mes helpers qui utilisent Router::url(). En revanche, de mon côté tout fonctionne nickel avec les controllers et actions

Je suis en cours de recherche pour résoudre ce probleme et adapter le composant Request pour une utilisation sur la plupart des serveurs.

perso tout va bien même depuis un vhost :)