Partage

erreur autoload à l'exécution

Le 7 septembre 2012 à 14:09:15

Bonjour,
je suis sur le tutoriel Description de l'application et au moment où je dois éffectuer le test et où je dois découvrir un gros blanc, j'ai ces deux lignes d'erreur:

- Warning: require(./Applications/Frontend/FrontendApplication.class.php) [function.require]: failed to open stream: No such file or directory in C:\wamp\www\monsupersite\Library\autoload.php on line 4
- Fatal error: require() [function.require]: Failed opening required './Applications/Frontend/FrontendApplication.class.php' (include_path='.;C:\php\pear') in C:\wamp\www\monsupersite\Library\autoload.php on line 4
je vous joint mon code autoload

<?php
function autoload($class)
{
require './'.str_replace('\\', '/', $class).'.class.php';
}
spl_autoload_register('autoload');

et mon code frontend.application.class.php

<?php
    namespace Applications\Frontend;
    
    class FrontendApplication extends \Library\Application
    {
        public function __construct()
        {
            parent::__construct();
            
            $this->name = 'Frontend';
        }
        
        public function run()
        {
            $controller = $this->getController();
            $controller->execute();
            
            $this->httpResponse->setPage($controller->page());
            $this->httpResponse->send();
        }
    }


Merci de m'aider.
Publicité
Le 7 septembre 2012 à 14:09:15
Le 7 septembre 2012 à 14:19:11

Vérifie le nom de la classe en l'affichant dans l'autoload.
Le 7 septembre 2012 à 14:49:25

hello,
Comment as tu nommé ton fichier?


frontend.application.class.php
ou
FrontendApplication.class.php

Si tu l'as nommé frontend.application.class.php le chemin renvoyer par l'autoload vers le fichier devrait être ./Applications/Frontend/frontend.application.class.php, hors ta fonction renvoie ./Applications/Frontend/FrontendApplication.class.php donc dans ce cas normal qu'il ne le trouve pas. Il faut donc que tu modifies ta fonction en conséquence.
Dans l'autre cas, il faut être sur que ton chemin est bon pour pouvoir charger la classe.

franckysolo
Le 7 septembre 2012 à 16:01:08

j'ai bien nommé mon fichier FontendApplication.class.php de ce côté là aucune erreur.
Le 7 septembre 2012 à 16:04:39

Windows ne tient pas compte de la casse.

C'est quoi l'arborescence de ces fichiers ?
Le 7 septembre 2012 à 16:07:49

Citation : Rachel Amana

et mon code frontend.application.class.php


Mais tiens compte des points!

A mon avis, le chemin de la classe est faux, faudrait rajouter le chemin du dossier Library dans l'include_path
Le 7 septembre 2012 à 16:17:30

Voilà l'arborescence de mes fichiers

  • -Applications
    • -Frontend
      • -Modules
      • -Config
      • -Templates
      • FrontendApplication.class.php
      • -News
      • News.controller.class.php
    • -Backend
  • -Library
    • -Entities
    • -Models
    • autoload.php page.php Application.class.php ApplicationComponent.class.php Config.class.php Entity.class.php Route.class.php Router.class.php User.class.php Managers.class.php BackController.class.php HTTPRequest.class.php HTTPResponse.class.php
  • -Web
    • -Css
    • -Images
    • Frontend.php .htaccess

Le 7 septembre 2012 à 16:28:49

monsupersite
   Applications
     Frontend
	Config
	Mondules
           News
              News.controller.class.php
	Templates
        FrontendApplication.class.php
   Library
      Entities
      Models
      Autoload.php
      Page.class
   Web
      Css
      Images
      .htaccess
      Frontend.php

Le chemin du fichier dépend d'où est appelée la page qui inclue le fichier "Autoload.php".

Si tu lances "monsupersite/Web/Frontend.php" qui inclus "monsupersite/Library/Autoload.php" par exemple, le "./" correspond au répertoire "monsupersite/Web/" car "Frontend.php" est dans ce dossier.

Donc pour atteindre "monsupersite/Applications/Frontend/" à partir de "monsupersite/Web/" il faut revenir d'un dossier en arrière avec un chemin relatif du type '../' pour arriver sur "monsupersite/".

Edit : Je sais plus exactement quel est le comportement des namespaces dans tous ça, d'après ton erreur la $class pointe déjà sur "Applications/Frontend/" grâce à son namespace j'imagine.

<?php require '../'.str_replace('\\', '/', $class).'.class.php';
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 7 septembre 2012 à 17:17:50

Merci Sombrelune. il ya une autre erreur mais celle-ci est résolue.
Le 10 septembre 2012 à 15:59:46

re-Bonjour

En fait mon problème n'était pas reglédu tout. lorsque j'ajoute .devant le slash de Applications pour remonter d'un niveau l'erreur sur FrontendApplication.class.php disparait et celle-ci apparait:
Warning: require(../Applications/Frontend/Modules/News/Config.class.php) [function.require]: failed to open stream: No such file or directory in C:\wamp\www\monsupersite\Library\autoload.php on line 4

si je supprime un niveau en enlevant un point devant le slash, l'erreur sur FrontendApplication.class.php apparait et celle sur Config.class.php apparait.
Warning: require(./Applications/Frontend/FrontendApplication.class.php) [function.require]: failed to open stream: No such file or directory in C:\wamp\www\monsupersite\Library\autoload.php on line 4

je sais plus quoi faire.
Le 10 septembre 2012 à 16:27:42

Explique nous exactement comment sont inclus tous tes fichiers, en commençant par le fichier appelé par l'url, et remets nous l'arborescence de tes fichiers si tu l'as modifié.
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 10 septembre 2012 à 17:07:45

re-voilà l'arborescence de mes fichiers

  • -Applications
    • -Frontend
      FrontendApplication.class.php
      • -Modules
      • -Config
        app.xml
        routes.xml
      • -Templates
        Layout.php
      • -News
        News.controller.class.php
        • -Views Index.php
    • -Backend
      • -Modules
  • -Library
    autoload.php
    page.php
    Application.class.php
    ApplicationComponent.class.php
    Config.class.php Entity.class.php
    Route.class.php
    Router.class.php
    User.class.phpManagers.class.php
    BackController.class.php
    HTTPRequest.class.php
    HTTPResponse.class.php
    • -Entities
      News.class.php
    • -Models
      NewsManager.class.php
      NewsManager_PDO.class.php
  • -Web
    • -Css
    • -Images
      Frontend.php
      .htaccess

Le 10 septembre 2012 à 17:23:03

Il nous manque le système d'inclusion des fichiers, c'est à dire :

- Quel fichier appelles tu par l'url ?

- Quels fichiers sont inclus dans ce fichier (celui appelé par l'url) (avec les fonctions include/require(_once)) ?

- Quels fichiers sont inclus par les fichiers qui sont inclus ? etc ... ;)

Prends l'exemple de ton fichier qui bug.

Ps : pour ton arborescence, copie-colle la simplement dans une balise de <code> du forum, les espaces seront conservés.
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 10 septembre 2012 à 17:28:44

je tape ceci sur mon navigateur l'url c'est http://monsupersite, je viens de mettre à jour l'arborescence de mes fichiers
ça c'est l'autoload
<?php
function autoload($class)
{ 
require '../'.str_replace('\\', '/', $class).'.class.php';
}
spl_autoload_register('autoload');

ça c'est l'autre fichier que l'autoload n'arrive pas à lancer
<?php
    namespace Library;
    
    class Config extends ApplicationComponent
    {
        protected $vars = array();
        
        public function get($var)
        {
            if (!$this->vars)
            {
                $xml = new \DOMDocument;
                $xml->load(__DIR__.'/../Applications/'.$this->app->name().'/Config/app.xml');
                // $xml->load(__DIR__.'monsupersite/Applications/Config/app.xml'); 
                $elements = $xml->getElementsByTagName('define');
                
                foreach ($elements as $element)
                {
                    $this->vars[$element->getAttribute('var')] = $element->getAttribute('value');
                }
            }
            
            if (isset($this->vars[$var]))
            {
                return $this->vars[$var];
            }
            
            return null;
        }
    }
Le 10 septembre 2012 à 17:42:03

Hummm, déjà d'après ta première erreur et l'arborescence de tes fichiers, on vois que effectivement "../Applications/Frontend/Modules/News/Config.class.php" n'existe pas, car "Config.class.php" est dans "../Library/Config.class.php". Donc soit tu déplaces "Config.class.php" dans le bon dossier soit tu mets à jour tes namespaces.
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 10 septembre 2012 à 18:01:33

j'ai mis Config.class.php dans Applications/Frontend/modules/News/ et maintenant àa me donne encore cette erreur :
Fatal error: Class 'Applications\Frontend\Modules\News\Config' not found in C:\wamp\www\monsupersite\Applications\Frontend\Modules\News\NewsController.class.php on line 8
voilà mon fichier NewsController.class.php. cette erreur est sur la ligne où je crée une instance de config:
<?php
    namespace Applications\Frontend\Modules\News;
    
    class NewsController extends \Library\BackController
    {
        public function executeIndex(\Library\HTTPRequest $request)
        {
		    $config = new Config();
            $nombreNews = $this->app->config()->get('nombre_news');
            $nombreCaracteres = $this->app->config()->get('nombre_caracteres');
            
            // On ajoute une définition pour le titre
            $this->page->addVar('title', 'Liste des '.$nombreNews.' dernières news');
            
            // On récupère le manager des news
            $manager = $this->managers->getManagerOf('News');
            
            // Cette ligne, vous ne pouviez pas la deviner sachant qu'on n'a pas encore touché au modèle
            // Contentez-vous donc d'écrire cette instruction, nous implémenterons la méthode ensuite
            $listeNews = $manager->getList(0, $nombreNews);
            
            foreach ($listeNews as $news)
            {
                if (strlen($news->contenu()) > $nombreCaracteres)
                {
                    $debut = substr($news->contenu(), 0, $nombreCaracteres);
                    $debut = substr($debut, 0, strrpos($debut, ' ')) . '...';
                    
                    $news->setContenu($debut);
                }
            }
            
            // On ajoute la variable $listeNews à la vue
            $this->page->addVar('listeNews', $listeNews);
        }
    }
Le 10 septembre 2012 à 21:32:41

Bon, ça va être super chiant à débugger si j'ai les classes/erreurs une par une, donc je vais essayer de t'expliquer comment ça marche, et toi tu vas appliquer les règles pour modifier ce qu'il faut par toi même, comme ça tu feras les choses à ta manière et ça serra bien organisé dans ton esprit. ;)

Premièrement, dans un chemin de dossiers, le "./" correspond au répertoire courant dans lequel est le premier fichier .php qui a été appelé lors de l'exécution du script (tu peux le connaitre en affichant <?php echo $_SERVER['SCRIPT_NAME']; ?> qui est le chemin d'url par rapport à la racine de ton système de fichier, qui le dossier "www" par défaut, sinon tu as <?php echo $_SERVER['SCRIPT_FILENAME']; ?> pour le chemin absolu à partir de C: par exemple sous windows). Bref, si veux vérifier qu'est ce qu'est "./" facilement tu affiches simplement <?php echo dirname($_SERVER['SCRIPT_NAME']); ?> pour être sûr.

Le "../", quant à lui, correspond au répertoire parent qui est spécifié juste avant lui (le répertoire courant si rien n'est spécifié). Donc si on est sur "truc/bidule/chouette/fichier.php", qui est le fichier d'entrée du script PHP, et que l'on a le chemin "../" alors on parle du dossier "truc/bidule/", si on avait "../../" alors on parlerait de "truc/" et ainsi de suite pour "../../../". On peut ajouter un chemin après des "../" pour accéder à un autre répertoire/fichier se trouvant à la racine des "../", par exemple, "../../autre/fichier.php" désignerait "truc/autre/fichier.php" dans l'exemple précédent.

Ensuite, on a les namespaces. Quand on met un namespace sur une page, tout ce qui suit est alors enregistrée dans le scope de ce namespace uniquement, c'est-à-dire que les classes/fonctions/variables existeront uniquement si on se trouve dans le même namespace où ils ont été définis (ou si on inclut spécifiquement les éléments dans le namespace courant).

Quand on crée une classe/fonction dans un namespace elle appartient donc à ce namespace est son nom est défini en tant que tel, si on crée la classe "Test" dans un namespace appelé "mes\dossiers" alors la classe se verra attribuer pour nom complet : "mes\dossiers\Test". Quand on appel une classe dans un namespace, PHP essaye de trouver la classe correspondante dans le namespace courant, donc si on fait un "new MaClass();" dans le namespace "mes\dossiers" alors PHP essayera de trouver la classe "mes\dossiers\MaClass" pour l'instancier.

Par la suite, il est possible si on est dans un namespace spécifique d'importer un élément défini dans un autre namespace en l'appelant par son nom complet. Par exemple si le namespace courant est "mes\dossiers" et que je veux faire un "new Test()" alors que Test est définit dans le namespace "autres\trucs" je peux l'appeler à l'intérieur du namespace "mes\dossiers" en faisant "new autres\trucs\Test();". Tu peux aussi importer les éléments du namespace global (les éléments qui n'ont pas été définit explicitement dans un namespace sont enregistrés dans le namespace global), il te suffit de simplement mettre "\", pour appeler des éléments implémentés/importés directement par PHP tu utiliseras donc par exemple "new \DateTime();" car DateTime est une classe définie dans le namespace global.

Quand une classe étends (avec le mot clé "extends") une autre classe elle est obligée d'aller chercher la classe en passant par son namespace car la classe doit être définie dans son propre namespace avec cette technique d'autoloading, on a donc des définitions de classe du genre "class truc extends mon\espace\maclass""maclass" est la classe censé être définie dans le namespace "mon\espace".

Coté function "autoload", celle-ci fait un require() sur $class en transformant les "\" du nom complet de la classe en "/" (pour en créer un répertoire valide) et en ajoutant un répertoire de base avant celui-ci. Donc si on a besoin de "MaClass()" dans le namespace "mes\dossiers" le nom complet "mes\dossiers\MaClass" serra envoyé à la fonction "autoload" et transformé en "./mes/dossiers/MaClass.php" pour être incluse. Si le fichier n'existe pas require() renvoi une erreur fatale, si le fichier existe mais qu'il ne contient pas la définition de la classe MaClass() alors une autre erreur fatale est envoyée pour indiquer que la classe n'a pas été trouvée malgré la tentative de spl_autoload_register().

Voila, je crois que c'est à peu près tout ce qu'il faut que tu saches pour organiser ton code, si les autres gens ont des corrections/ajout à faire au niveau de ce que j'ai dit sur les namespaces qu'ils n'hésitent pas, j'utilise très peu les namespaces et je peux me tromper comme tout le monde. ;)

Donc, au final, il faut adapter la structure des répertoires en fonction de la position du premier fichier php appelé, de ce que tu mets dans ta fonction "autoload" et du nom de tes namespaces, en sachant que tu peux importer les classes d'autres namespace au besoin.

PS : Oui ! j'ai mis les textes entre double-quote en bleu et c'est moche, mais au moins on s'y retrouve plus vite dans le pavé :-° .
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 11 septembre 2012 à 9:22:40

re,
il faut que tu modifie ta fonction autoload et ajouter à l'include path les chemins des dossiers Application et Library
tu pourrais même aussi en faire un objet :
<?php
namespace Library;
class Autoload
{		
	private static $_instance = null;	
	public static $libraryPath = "";	
	public static $applicationPath = "";	
	public static $basePath = "";
		
	private function __construct(){}	
	private function __clone(){}
		
	
	private static function _autoload($className)
	{
		$class = $className . '.php'; //ici .class. a rajouter si tu veux
		require $class;
	}
	
	
	public static function startUp($dirname = 'Applications')
	{

		if(null !== self::$_instance) {
			throw new \RuntimeException('%s is already started', __CLASS__), 500);
		}	
		
		self::$_instance = new self();

		//	Prepare include path
		self::$libraryPath 		= realpath(__DIR__ . DIRECTORY_SEPARATOR . '..');
		self::$basePath 		= pathinfo(self::$libraryPath, PATHINFO_DIRNAME);
                self::$applicationPath 	= self::$basePath . DIRECTORY_SEPARATOR . $dirname;   
            
                $paths = array(
        	   self::$basePath,
        	   self::$libraryPath,
        	   self::$applicationPath
                );
                
	 	//	set the include path
            if(!set_include_path(get_include_path() . PATH_SEPARATOR . implode(PATH_SEPARATOR, $paths))) {
        	throw new \InvalidArgumentException(
        		'Could not set your values on the include path ', 500
        	);
            } 
        
            //start the autoload
            if(!spl_autoload_register(array(self::$_instance, '_autoload'), false)) {
        	throw \RuntimeException('Could not start the autoload', 500);
            }
	}
	
	
	public static function shutDown()
	{
		if(null !== self::$_instance) {
				
			if(!spl_autoload_unregister(array(self::$_instance, '_autoload'))) {
				throw new \RuntimeException('%s :Could not stop the autoload', __CLASS__, 500);
			}
				
			self::$_instance = null;
		}
	}
}


et donc :


Utilisation :

<?php
require_once 'Library/Autoload.php';
use Library\Autoload;
Autoload::startUp();
//utilise ta librarie
Autoload::shutDown();


<?php
    namespace Library;
    use Library\Autoload
    use Library\ApplicationComponent;
    class Config extends ApplicationComponent
    {
        protected $vars = array();
        
        public function get($var)
        {
            if (!$this->vars)
            {
                $xml = new \DOMDocument;
                $xml->load(Autoload::$applicationPath . $this->app->name().'/Config/app.xml');
                $elements = $xml->getElementsByTagName('define');
                
                foreach ($elements as $element)
                {
                    $this->vars[$element->getAttribute('var')] = $element->getAttribute('value');
                }
            }
            
            if (isset($this->vars[$var]))
            {
                return $this->vars[$var];
            }
            
            return null;
        }
    }


franckysolo
Le 11 septembre 2012 à 14:20:52

Merci à sombrelune et à fancky solo. j'ai porté tes modifications franckysolo mais jene sais pas si je suis laseule qui a autant d'erreurs sur ce tutoriel ou si je fais tout à l'envers. après que j'ai inclu les chemins dans l'include path, et géré un certain nombre d'erreur encore je suis à nouveau bloqué sur cette erreur: Warning: require(../Library/autoload.class.php) [function.require]: failed to open stream: No such file or directory in C:\wamp\www\monsupersite\Library\autoload.php on line 6
<?php
require_once '../Library/autoload.php';
use Library\autoload;
function autoload($class)
    {
        require '../'.str_replace('\\', '/', $class).'.class.php';
    }
    
   spl_autoload_register('autoload');


et quand je clique sur Function require j'ai ceci:

Notice: Undefined variable: matchedRoute in C:\wamp\www\monsupersite\Library\Application.class.php on line 61
Fatal error: Call to a member function vars() on a non-object in C:\wamp\www\monsupersite\Library\Application.class.php on line 61. pourtant c'est ce qui est figure dans le tutoriel je n'ai rien ajouté
<?php
    namespace Library;
    
    abstract class Application
    {
        protected $httpRequest;
        protected $httpResponse;
        protected $name;
		protected $user;
		protected $config;
        
        public function __construct()
        {
            $this->httpRequest = new HTTPRequest($this);
            $this->httpResponse = new HTTPResponse($this);
            $this->user= new User($this);
			$this->config=new Config($this);
			
            $this->name = '';
        }
        
        public function getController()
        {
            $router = new \Library\Router;
            
            $xml = new \DOMDocument;
            $xml->load(__DIR__.'/../Applications/'.$this->name.'/Config/routes.xml');
            
            $routes = $xml->getElementsByTagName('route');
            
            // On parcoure les routes du fichier XML
            foreach ($routes as $route)
            {
                $vars = array();
                
                // On regarde si des variables sont présentes dans l'URL
                if ($route->hasAttribute('vars'))
                {
                    $vars = explode(',', $route->getAttribute('vars'));
                }
                
                // On ajoute la route au routeur
                $router->addRoute(new Route($route->getAttribute('url'), $route->getAttribute('module'), $route->getAttribute('action'), $vars));
            }
            
            try
            {
                // On récupère la route correspondante à l'URL
                $matchedRoute = $router->getRoute($this->httpRequest->requestURI());
            }
            catch (\RuntimeException $e)
            {
                if ($e->getCode() == \Library\Router::NO_ROUTE)
                {
                    // Si aucune route ne correspond, c'est que la page demandée n'existe pas
                    $this->httpResponse->redirect404();
                }
            }
            
            // On ajoute les variables de l'URL au tableau $_GET
            $_GET = array_merge($_GET, $matchedRoute->vars());
            
            // On instancie le contrôleur
            $controllerClass = 'Applications\\'.$this->name.'\\Modules\\'.$matchedRoute->module().'\\'.$matchedRoute->module().'Controller';
            return new $controllerClass($this, $matchedRoute->module(), $matchedRoute->action());
        }
        
        abstract public function run();
        
        public function httpRequest()
        {
            return $this->httpRequest;
        }
        
        public function httpResponse()
        {
            return $this->httpResponse;
        }
        
        public function name()
        {
            return $this->name;
        }
		
		public function config()
        {
            return $this->config;
        }
		
		public function user()
        {
            return $this->user;
        }
		
    }


merci
Le 11 septembre 2012 à 16:46:53

:D eh bien c'est laborieux!
dis moi y a comme un soucis tu inclue le fichier autoload.php et après tu ajoutes ta fonction autoload (qui serait sensé être dans ce fichier), mais il y quoi dans ton fichier autoload.php? :euh:
Ensuite, je te conseille d'aller lire un cours sur les namespaces car tu m'as l'air perdu.
Puis lorsque tu as ce genre d'erreur :

Warning: require(../Library/autoload.class.php) [function.require]: failed to open stream: No such file or directory in C:\wamp\www\monsupersite\Library\autoload.php on line 6

C'est que ton chemin vers le fichier que tu tentes d'inclure n'est pas bon.
Après sans vouloir t'embrouiller plus, je dirais que tu devrais revoir ton arbo, ton dossier library logiquement sert à stocker des libs et/ou framework, donc imagine que tu ai envie d'utiliser Doctrine ou un autre framework utilisant les namespaces, avec ton arbo ça va devenir vite le bordel, tu devrais plutôt assigner un nom à ta propre lib et le mettre dans le dossier library qui soit dit en passant n'a pas besoin de majuscule.
En gros :
library
+ MyFramwork //ici le namespace commencerais par MyFramework
+ Doctrine2
+ Zend2
+ SF2
applications
+ modules
+ configs
+ includes
Bon après c'est une façon de faire, à chacun son truc
Edit : ah oui pour ton autre erreur ta variable $matchedRoute n'est pas initialisé, et visiblement lorsque que tu récupère la route celle ci est null ou vide du moins tu n'obtient pas une instance de Route, donc tu n'accède pas à la méthode vars().
Le 12 septembre 2012 à 14:03:49

Ok. Je vais donc reprendre tout à zero.
Merci
Le 6 octobre 2012 à 16:43:23

Salut a tous,

J'avais le meme probleme sur l'autoload, et la mon probleme provient de la variable $matchedroute mais la je reste bloqué car je me suis plus qu'embrouillé.

1. y'a t'il un rapport entr l'autoload et cette variable retourné a null ?

2. Qui doit initialiser cette variable ? je crois comprendre a quoi elle sert mais il est vrai que cette partie du tp et entrain de me massacrer.

Je rentre dans le site http://localhost et j'arrive sur le dossier WEB "INDEX of /" et je dois cliquer sur frontend.php. j'avoue j'ai encore un petit probleme de configuration :)


Merci
Le 8 octobre 2012 à 10:22:53

re,

$matchedrouted provient du Router via la méthode getRoute, si cette variable est null c'est que tu n'as pas de route correspondante enfin je pense. Elle devrait te retourner un objet Route.

1. Non pas de rapport

2. Dans ton code elle n'est pas initialisée
Tu aurais pu faire ceci :
<?php
$matchedRoute = null;
$matchedRoute = $router->getRoute($this->httpRequest->requestURI());
if(null == $matchedRoute) {
    throw new \Exception('No route defined for this url');
}



Ton autoload te sert juste à insérer les classes appelées dans la pile de l'__autoload (inclusions des classes)
Le router ici te sert à analyser les paramètres de la requête (url) et à assigner le module, contrôleur et vue spécifique à l'action demandée (la route spécifique).

Bon courage
franckysolo
Le 9 octobre 2012 à 14:13:59

Merci pour ta reponse.
Cool pour l'auto load j'avais compris en fait, mais bon comme j'avais la meme erreur que Rachel je me demandais si un rapport existait.

pour voir l'initiation de l'application à travers l'autoload j'avais inséré :
<?php 
print_r($class);
?>



EDIT: Bon voila après le rapide test, voila mon résultat :
- je vais bien lire le fichier de config.xml
- ensuite une exception est bien levée dans RuntimeException me disant qu'il n'y a "aucune route dans l'url" provenant de Router::GetRoute()

jusque-là tout va bien il me semble car dans la barre d'adresse j'ai seulement :

http://localhost/frontend.php or l'application attend soit http://localhost/ soit http://localhost/news-1.html avec un fichier route.xml comme dans le tuto.

encore merci pour ta réponse claire.
Le 10 octobre 2012 à 17:27:28

Citation : toi

j'ai seulement :

http://localhost/frontend.php or l'application attend soit http://localhost/ soit http://localhost/news-1.html



ça fonctionne alors? :euh:

si tu tapes http://localhost/frontend.php comme adresse normal qu'elle s'affiche dans la barre d'adresse
ce qui faut savoir c'est si tu tapes http://localhost/ soit http://localhost/news-1.html la bonne page de news s'affiche t'elle?
Le 11 octobre 2012 à 18:54:27

Salut frankysolo,

j'ai configuré correctement ma machine maintenant je tape juste monsupersite dans la barre d'adresse et j'ai bien la page d'acceuil qui s'affiche avec mes deux news.

Par contre depuis hier, je suis confronté au même probleme apparemment.

monsupertsite/news-1.html la même exception est levée a savoir

Citation

Une exception a été lancée. Message d'erreur : Aucune route ne correspond à l'URL

.

la où je bloque c'est dans la comprehension de la classe Router a ce niveau-la du code


<?php if (($varsValues = $route->match($url)) !== false){...}


La variable $varsvalues, d'où vient elle ? comment est-elle initialisée ?

juste avant cette condition j'imprime la valeur de $url est

Citation

/news-1.html


jusque là ca me semble OK, ensuite il se presente deux fois a cette condition (ce qui est normal vu que j'ai deux routes dans mon fichier routes.xml

La variable $varsvalue est qd à elle vide, je doit probablement l'initialisé mais j'ai pas encore vu où je dois le faire.

bon voila j'espere que j'ai reumé la situation clairement :euh:
Le 11 octobre 2012 à 19:19:18

Salut :) ,

Dans l'exemple que tu donnes, la variable $varsValues est crée à la volée, juste avant le test conditionnel.

Ça revient exactement au même de faire :

<?php
    
    $varsValues = $route->match($url);
    if( $varsValues !== false ){ ... }
    
?>

C'est juste que ça prends moins de place, et que généralement on a pas besoin de la variable à l’extérieur de la condition.

Tu devrais plutôt regarder dans ton fichier "routes.xml", c'est lui qui contient l'erreur à 99% ;) .
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 11 octobre 2012 à 20:00:59

Merci Sombrelune pour ta réponse rapide, je voyais qu'il y avait quelque chose bizarre dans cette condition.
tiens je te poste le fichier routes.xml si ca peut aider.


<?xml version="1.0" encoding="iso-8859-1" ?>
<routes>
<route url="/" module="News" action="index" />
<route url="/news-(.+)-([0-9]+)\.html" module="News" action="show" vars="id" />
</routes>


est-ce que ca peut provenir d'un problème de casse 'vars' au lieu de 'Vars' ou quelque chose du genre ?


EDIT : le match() me renvoie un false;

voici la methode match que j'utilise (celle du tuto) :
<?php 
	public function match($url)
	{
		if (preg_match('`^'.$this->url.'$`', $url, $matches))
		{
			return $matches;
		}
		else
		{
			return false;
		}
	}


que signifie le caractere ` dans cet exemple ? s'agit t'il d'un caractere parasite car dans la doc
function.preg-match, je n'ai rien vu de spécial parlant spécifiquement de ce caractère ?
Le 11 octobre 2012 à 20:32:33

Effectivement, la regex n'est pas adapté à ton emploi, car "/news-(.+)-([0-9]+)\.html" peut matcher "/news-truc-1.html" mais pas "/news-1.html" car l'expression ".+" désigne au moins 1 caractère, qui est précédé par un "-" qui plus est.

Si tu veux rendre le contenu ("-truc" dans mon premier exemple) facultatif il faut englober le tout par des parenthèses et un "?" pour spécifier que l'expression n'est pas obligatoire.

<?xml version="1.0" encoding="iso-8859-1" ?>
<routes>
<route url="/" module="News" action="index" />
<route url="/news(-.+)?-([0-9]+)\.html" module="News" action="show" vars="id" />
</routes>

Je sais pas trop comment tu récupères les paramètres $1 et $2 de la regexp, mais dans ce cas là, $1 (première parenthèse de la regexp), vaudra "-truc" avec l'url "/news-truc-1.html" oubien sera vide "" pour l'url "/news-1.html", et $2 (deuxième parenthèse de la regex) vaudra dans les deux cas "1".

Donc c'est le paramètre $2 qui te renseigne l'id de ta news.
N'oubliez pas de mettre vos sujets en résolu quand il le sont.
Le 12 octobre 2012 à 0:25:41

Bien mon probleme est bien celui-la, lorsque j'entre

http://monsupersite/news-1-1.html

j'affiche bien la page news #1
maintenant j'ai plus qu'a corriger car je ne voulais pas faire news-truc-1.html,
d'ou l'utilisation d'une seule variable en sortie 'id'.
merci pour ton aide precieuse car je l'aurai pas vu avant un bout de temps.

erreur autoload à l'exécution

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown