Bonjour,<br>
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: <br><br>
- 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<br>
- 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<br>
je vous joint mon code autoload <br><br><pre class="brush: php;"><?php
function autoload($class)
{
require './'.str_replace('\\', '/', $class).'.class.php';
}
spl_autoload_register('autoload');
</pre><br>
et mon code frontend.application.class.php<br><br><pre class="brush: 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();
}
}
</pre><br><br>
Merci de m'aider.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();
}
}
hello,<br><div class="rmq question">Comment as tu nommé ton fichier?</div><br><br>
frontend.application.class.php <br>
ou<br>
FrontendApplication.class.php<br><br>
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.<br>
Dans l'autre cas, il faut être sur que ton chemin est bon pour pouvoir charger la classe.<br><br>
franckysolo<br>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.
<p><strong>Citation : Rachel Amana</strong></p><blockquote>et mon code frontend.application.class.php</blockquote><br>
Mais tiens compte des points!<br><br>
A mon avis, le chemin de la classe est faux, faudrait rajouter le chemin du dossier Library dans l'include_pathLe 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
<pre class="brush: php;">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
</pre><br>
Le chemin du fichier dépend d'où est appelée la page qui inclue le fichier "Autoload.php".<br><br>
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.<br><br>
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/".<br><br><strong>Edit</strong> : 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.<br><br><span class="code2 html+php"><span class="cp"><?php</span> <span class="k">require</span> <span class="s1">'../'</span><span class="o">.</span><span class="nb">str_replace</span><span class="p">(</span><span class="s1">'\\'</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="nv">$class</span><span class="p">)</span><span class="o">.</span><span class="s1">'.class.php'</span><span class="p">;</span></span>Le 7 septembre 2012 à 16:28:49
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.
re-Bonjour<br><br>
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:<br>
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<br><br>
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.<br>
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<br><br>
je sais plus quoi faire.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
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é.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.
Il nous manque le système d'inclusion des fichiers, c'est à dire :<br><br>
- Quel fichier appelles tu par l'url ?<br><br>
- Quels fichiers sont inclus dans ce fichier (celui appelé par l'url) (avec les fonctions include/require(_once)) ?<br><br>
- Quels fichiers sont inclus par les fichiers qui sont inclus ? etc ... <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"><br><br>
Prends l'exemple de ton fichier qui bug.<br><br>
Ps : pour ton arborescence, copie-colle la simplement dans une balise de <code> du forum, les espaces seront conservés.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.
je tape ceci sur mon navigateur l'url c'est http://monsupersite, je viens de mettre à jour l'arborescence de mes fichiers<br>
ça c'est l'autoload <br><pre class="brush: php;"><?php
function autoload($class)
{
require '../'.str_replace('\\', '/', $class).'.class.php';
}
spl_autoload_register('autoload');
</pre><br>
ça c'est l'autre fichier que l'autoload n'arrive pas à lancer<br><pre class="brush: php;"><?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;
}
}
</pre>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;
}
}
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.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.
j'ai mis Config.class.php dans Applications/Frontend/modules/News/ et maintenant àa me donne encore cette erreur :<br>
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<br>
voilà mon fichier NewsController.class.php. cette erreur est sur la ligne où je crée une instance de config:<br><pre class="brush: php;"><?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);
}
}
</pre>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);
}
}
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. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"><br><br>
Premièrement, dans un chemin de dossiers, le <span class="bleu">"./"</span> correspond au répertoire courant dans lequel est <span class="souligne">le premier fichier .php qui a été appelé lors de l'exécution du script</span> (tu peux le connaitre en affichant <span class="code2 html+php"><span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'SCRIPT_NAME'</span><span class="p">];</span> <span class="cp">?></span></span> qui est le chemin d'url par rapport à la racine de ton système de fichier, qui le dossier "<span class="bleu">www</span>" par défaut, sinon tu as <span class="code2 html+php"><span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'SCRIPT_FILENAME'</span><span class="p">];</span> <span class="cp">?></span></span> pour le chemin absolu à partir de C: par exemple sous windows). Bref, si veux vérifier qu'est ce qu'est <span class="bleu">"./"</span> facilement tu affiches simplement <span class="code2 html+php"><span class="cp"><?php</span> <span class="k">echo</span> <span class="nb">dirname</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'SCRIPT_NAME'</span><span class="p">]);</span> <span class="cp">?></span></span> pour être sûr.<br><br>
Le <span class="bleu">"../"</span>, 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 <span class="bleu">"truc/bidule/chouette/fichier.php"</span>, qui est le fichier d'entrée du script PHP, et que l'on a le chemin <span class="bleu">"../"</span> alors on parle du dossier <span class="bleu">"truc/bidule/"</span>, si on avait <span class="bleu">"../../"</span> alors on parlerait de <span class="bleu">"truc/"</span> et ainsi de suite pour <span class="bleu">"../../../"</span>. On peut ajouter un chemin après des <span class="bleu">"../"</span> pour accéder à un autre répertoire/fichier se trouvant à la racine des <span class="bleu">"../"</span>, par exemple, <span class="bleu">"../../autre/fichier.php"</span> désignerait <span class="bleu">"truc/autre/fichier.php"</span> dans l'exemple précédent.<br><br>
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).<br><br>
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 <span class="bleu">"Test"</span> dans un namespace appelé <span class="bleu">"mes\dossiers"</span> alors la classe se verra attribuer pour nom complet : <span class="bleu">"mes\dossiers\Test"</span>. Quand on appel une classe dans un namespace, PHP essaye de trouver la classe correspondante dans le namespace courant, donc si on fait un <span class="bleu">"new MaClass();"</span> dans le namespace <span class="bleu">"mes\dossiers"</span> alors PHP essayera de trouver la classe <span class="bleu">"mes\dossiers\MaClass"</span> pour l'instancier.<br><br>
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 <span class="bleu">"mes\dossiers"</span> et que je veux faire un <span class="bleu">"new Test()"</span> alors que Test est définit dans le namespace <span class="bleu">"autres\trucs"</span> je peux l'appeler à l'intérieur du namespace <span class="bleu">"mes\dossiers"</span> en faisant <span class="bleu">"new autres\trucs\Test();"</span>. 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 <span class="bleu">"\"</span>, pour appeler des éléments implémentés/importés directement par PHP tu utiliseras donc par exemple <span class="bleu">"new \DateTime();"</span> car DateTime est une classe définie dans le namespace global.<br><br>
Quand une classe étends (avec le mot clé <span class="bleu">"extends"</span>) 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 <span class="bleu">"class truc extends mon\espace\maclass"</span> où <span class="bleu">"maclass"</span> est la classe censé être définie dans le namespace <span class="bleu">"mon\espace"</span>.<br><br>
Coté function <span class="bleu">"autoload"</span>, celle-ci fait un require() sur $class en transformant les <span class="bleu">"\"</span> du nom complet de la classe en <span class="bleu">"/"</span> (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 <span class="bleu">"MaClass()"</span> dans le namespace <span class="bleu">"mes\dossiers"</span> le nom complet <span class="bleu">"mes\dossiers\MaClass"</span> serra envoyé à la fonction <span class="bleu">"autoload"</span> et transformé en <span class="bleu">"./mes/dossiers/MaClass.php"</span> 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().<br><br>
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. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"><br><br>
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 <span class="bleu">"autoload"</span> et du nom de tes namespaces, en sachant que tu peux importer les classes d'autres namespace au besoin.<br><br>
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é <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/siffle.png" alt=":-°" class="smilies"> .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 <?phpecho$_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 <?phpecho$_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 <?phpechodirname($_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" où "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.
re,<br>
il faut que tu modifie ta fonction autoload et ajouter à l'include path les chemins des dossiers Application et Library<br>
tu pourrais même aussi en faire un objet :<br><div class="spoiler2_hidden"><div class="spoiler3_hidden"><pre class="brush: php;"><?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;
}
}
}
</pre></div></div><br><br>
et donc :<br><br><br>
Utilisation :<br><br><pre class="brush: php;"><?php
require_once 'Library/Autoload.php';
use Library\Autoload;
Autoload::startUp();
//utilise ta librarie
Autoload::shutDown();
</pre><br><br><pre class="brush: php;"><?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;
}
}
</pre><br><br>
franckysolo<br>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;
}
}
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<br><pre class="brush: php;"><?php
require_once '../Library/autoload.php';
use Library\autoload;
function autoload($class)
{
require '../'.str_replace('\\', '/', $class).'.class.php';
}
spl_autoload_register('autoload');
</pre><br><br>
et quand je clique sur Function require j'ai ceci:<br><br>
Notice: Undefined variable: matchedRoute in C:\wamp\www\monsupersite\Library\Application.class.php on line 61<br>
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é<br><pre class="brush: php;"><?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;
}
}
</pre><br><br>
merciLe 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;
}
}
<img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/heureux.png" alt=":D" class="smilies"> eh bien c'est laborieux!<br>
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? <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/unsure.gif" alt=":euh:" class="smilies"><br>
Ensuite, je te conseille d'aller lire un cours sur les namespaces car tu m'as l'air perdu.<br>
Puis lorsque tu as ce genre d'erreur :<br><br><div class="rmq 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</div><br>
C'est que ton chemin vers le fichier que tu tentes d'inclure n'est pas bon.<br>
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.<br>
En gros :<br>
library<br>
+ MyFramwork //ici le namespace commencerais par MyFramework<br>
+ Doctrine2<br>
+ Zend2<br>
+ SF2<br>
applications<br>
+ modules<br>
+ configs<br>
+ includes<br>
Bon après c'est une façon de faire, à chacun son truc<br>
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 11 septembre 2012 à 16:46:53
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?
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().
Salut a tous,<br><br>
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é. <br><br>
1. y'a t'il un rapport entr l'autoload et cette variable retourné a null ?<br><br>
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.<br><br>
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 <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"><br><br><br>
Merci<br>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
re,<br><br>
$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.<br><br>
1. Non pas de rapport<br><br>
2. Dans ton code elle n'est pas initialisée<br>
Tu aurais pu faire ceci :<br><pre class="brush: php;"><?php
$matchedRoute = null;
$matchedRoute = $router->getRoute($this->httpRequest->requestURI());
if(null == $matchedRoute) {
throw new \Exception('No route defined for this url');
}
</pre><br><br><br>
Ton autoload te sert juste à insérer les classes appelées dans la pile de l'__autoload (inclusions des classes)<br>
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).<br><br>
Bon courage<br>
franckysoloLe 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).
Merci pour ta reponse.<br>
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.<br><br>
pour voir l'initiation de l'application à travers l'autoload j'avais inséré :<br><pre class="brush: php;"><?php
print_r($class);
?>
</pre><br><br><br>
EDIT: Bon voila après le rapide test, voila mon résultat : <br>
- je vais bien lire le fichier de config.xml<br>
- 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()<br><br>
jusque-là tout va bien il me semble car dans la barre d'adresse j'ai seulement :<br><br><a href="http://localhost/frontend.php">http://localhost/frontend.php</a> or l'application attend soit http://localhost/ soit <a href="http://localhost/news-1.html">http://localhost/news-1.html</a> avec un fichier route.xml comme dans le tuto.<br><br>
encore merci pour ta réponse claire.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 :
<p><strong>Citation : toi</strong></p><blockquote>j'ai seulement :<br><br><a href="http://localhost/frontend.php">http://localhost/frontend.php</a> or l'application attend soit http://localhost/ soit <a href="http://localhost/news-1.html">http://localhost/news-1.html</a> </blockquote><br><br>
ça fonctionne alors? <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/unsure.gif" alt=":euh:" class="smilies"><br><br>
si tu tapes <a href="http://localhost/frontend.php">http://localhost/frontend.php</a> comme adresse normal qu'elle s'affiche dans la barre d'adresse<br>
ce qui faut savoir c'est si tu tapes http://localhost/ soit <a href="http://localhost/news-1.html">http://localhost/news-1.html</a> la bonne page de news s'affiche t'elle?Le 10 octobre 2012 à 17:27:28
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?
Salut frankysolo,<br><br>
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.<br><br>
Par contre depuis hier, je suis confronté au même probleme apparemment.<br><br>
monsupertsite/news-1.html la même exception est levée a savoir <p><strong>Citation</strong></p><blockquote>Une exception a été lancée. Message d'erreur : Aucune route ne correspond à l'URL</blockquote>.<br><br>
la où je bloque c'est dans la comprehension de la classe Router a ce niveau-la du code <br><br><br><pre class="brush: php;"><?php if (($varsValues = $route->match($url)) !== false){...}
</pre><br><br>
La variable $varsvalues, d'où vient elle ? comment est-elle initialisée ?<br><br>
juste avant cette condition j'imprime la valeur de $url est<br><p><strong>Citation</strong></p><blockquote>/news-1.html</blockquote><br>
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<br><br>
La variable $varsvalue est qd à elle vide, je doit probablement l'initialisé mais j'ai pas encore vu où je dois le faire.<br><br>
bon voila j'espere que j'ai reumé la situation clairement <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/unsure.gif" alt=":euh:" class="smilies">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
Salut <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"> ,<br><br>
Dans l'exemple que tu donnes, la variable $varsValues est crée à la volée, juste avant le test conditionnel.<br><br>
Ça revient exactement au même de faire :<br><br><pre class="brush: php;"><?php
$varsValues = $route->match($url);
if( $varsValues !== false ){ ... }
?>
</pre><br>
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.<br><br>
Tu devrais plutôt regarder dans ton fichier "routes.xml", c'est lui qui contient l'erreur à 99% <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"> .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.
Merci Sombrelune pour ta réponse rapide, je voyais qu'il y avait quelque chose bizarre dans cette condition.<br>
tiens je te poste le fichier routes.xml si ca peut aider.<br><br><br><pre class="brush: xml;"><?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>
</pre><br><br>
est-ce que ca peut provenir d'un problème de casse 'vars' au lieu de 'Vars' ou quelque chose du genre ?<br><br><br>
EDIT : le match() me renvoie un false;<br><br>
voici la methode match que j'utilise (celle du tuto) :<br><pre class="brush: php;"><?php
public function match($url)
{
if (preg_match('`^'.$this->url.'$`', $url, $matches))
{
return $matches;
}
else
{
return false;
}
}
</pre><br><br>
que signifie le caractere ` dans cet exemple ? s'agit t'il d'un caractere parasite car dans la doc <br><a href="http://www.php.net/manual/fr/function.preg-match.php">function.preg-match</a>, je n'ai rien vu de spécial parlant spécifiquement de ce caractère ?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.
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 ?
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.<br><br>
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.<br><br><pre class="brush: html;"><?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>
</pre><br>
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".<br><br>
Donc c'est le paramètre $2 qui te renseigne l'id de ta news.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.
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.
Bien mon probleme est bien celui-la, lorsque j'entre <br><br><a href="http://monsupersite/news-1-1.html">http://monsupersite/news-1-1.html</a> <br><br>
j'affiche bien la page news #1<br>
maintenant j'ai plus qu'a corriger car je ne voulais pas faire news-truc-1.html, <br>
d'ou l'utilisation d'une seule variable en sortie 'id'.<br>
merci pour ton aide precieuse car je l'aurai pas vu avant un bout de temps.Le 12 octobre 2012 à 0:25:41
Bien mon probleme est bien celui-la, lorsque j'entre
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é.