Bonjour, je réalise le TP poo de vyk12 (siteduzéro) et je rencontre un problème.
Mon application est de type MVC avec router, des backend, frontend, .htaccess etc.
L'auteur du tuto a présenté le layout.php de cette façon :
http://wall.deblan.fr/x1683/php/1/
cependant j'obtiens les erreurs suivantes dans mon navigateur :
Notice: Undefined variable: user in C:\...\Applications\Frontend\Templates\layout.php on line 21
Fatal error: Call to a member function isAuthenticated() on a non-object in C:\...\Applications\Frontend\Templates\layout.php on line 21
D'après ce que j'ai compris, les variables sont passées au layout via la classe Page (dans le cours) . comme ceci :
http://wall.deblan.fr/x1684/php/1/
Y a t-il un problème sur ce script car les variables ne sont pas reconnues dans mon layout. quelques chose à changer ?
Voici des infos complémentaires afin de mieux pouvoir cerner le problème.
La classe Application : http://wall.deblan.fr/x1686/php/1/
Sa classe fille ApplicationComponent : http://wall.deblan.fr/x1687/php/1/
La classe FrontendApplication : http://wall.deblan.fr/x1689/php/1/
Le fichier frontend.php : http://wall.deblan.fr/x168a/php/1/
l'autoload : http://wall.deblan.fr/x1685/php/1/
merci.
J'ai juste jeté un coup d'oeil mais est-ce que $this->vars dans ta classe Page contient bien un offset "user" ?
Ligne 26 : $this->addVar('user', $this->app->user());
@vava740
que veux-tu dire par "un offset "user" " ? dans quel classe ? Peux-tu me donner des détails ?
deepblue, tu proposes que je change la ligne 26 par ton code ?
j'ai essayé et ça ne fonctionne toujours pas.
des idées ![]()
$this->vars est un array.
Quand tu fais extract($this->vars) tu créé dynamiquement autant de variables qu'il y a d'items dans ton array.
Tu inclue alors la vue et elle aura accès à toutes les variables que tu as extraites.
Si $user n'est pas définie dans ta vue, c'est qu'elle n'était pas dans le tableau $this->vars.
J'avais pas fait gaffe mais tu déclare bien un $user avant d'extraire le tableau de variables donc ça revient au même... le problème vient donc de $this->app->user() qui ne te retourne rien.
Et là si on regarde ta classe Application, elle n'a pas de méthode user(), je pense que c'est là le problème... mais ça m'étonne que ça ne t'aie pas déclenché d'erreur pour appeler une méthode non définie. ![]()
J'ai rajouté la fonction :
public function user()
{
return $this->user;
}
mais j'ai toujours la même erreur ![]()
Et le var_dump($user) avant le extract ?
J'ai essayé le var_dump et toujours rien ![]()
Comment ça "rien" ? Ça t'affiche quoi ?
Si ça ne t'affiche rien c'est que ta fonction getGeneratedPage() n'est jamais appelée... t'es pas censé l'appeler depuis l'application, ou le contrôleur ?
Le souci vient de $this->app->user(); qui doit retourner un null. Si tu fais un var_dump de $this->app->user(), ça devrait confirmer ce que je dis.
dans la classe page, j'ai fait var_dump($user) et j'ai toujours la même erreur dans mon layout.php
j'ai aussi fait var_dump($this->app->user()) ![]()
et il raconte quoi le var_dump ? http://php.net/var_dump histoire de comprendre ce que tu fais.
je pense avoir localisé le problème.
quand je vérifie mon fichier Page.class.php je me rend compte que celui-ci ne reconnait pas sa classe mère Application component.
J'ai cette erreur :
Fatal error: Class 'Library\ApplicationComponent' not found in C:\...\Library\Page.class.php on line 6
donc c'est pourquoi la variable $user n'est pas reconnu car celle_ci fait appel à $this->app() qui est une fonction de la classe ApplicationComponent.
Le plus bizzare, c'est que dans toute mon application, j'ai cette même erreur et aucune des classes filles de reconnaît sa classe mère quelle qu'elle soit
Pourtant je pense avoir correctement définie les namespace
Vous avez une idée de ce que je dois faire pour que mes classes mère soient reconnues ? ![]()
Vous avez une idée de ce que je dois faire pour que mes classes mère soient reconnues ?
Revoir ton autoload ?
R.A.S du côté de mon autoload.
Par contre j'ai du mal à comprendre une chose.
Dans ma classe Application J'ai un attribut $matchedRoute qui instancie une de mes classes qui se nomme Router (Voir ma classe Application ci dessus).
Et pourtant dans le cours, l'auteur fait, dans la classe Application une instruction où il fait $mactchedRoute->module()
Or module est une fonction qui se trouve dans une autre classe qui se nomme "Route". Or les classes Router et Route ne sont pas liées entre elles. Donc comment il peut appeller une fonction de la classe Route à Partir d'une instanciation de la classe Router ?
Voici les 2 classes en question :
Router : http://wall.deblan.fr/x16a3/php/1/
Route : http://wall.deblan.fr/x16a4/php/1/
est-ce vraiment correcte de faire $matchedRoute->module() ?
$matchedRoute dans ton application, c'est un Router ? Parce que vu le nom j'ai plutôt tendance à penser que c'est une Route, auquel cas elle a bien une méthode module().
Quoi qu'il en soit je persiste à penser qu'il y a un problème d'autoload si tu as toujours cet erreur de class not found (ou tu l'as pas mise dans le bon dossier, je sais pas, faut voir les règles de ton autoload...).
Au pire fais un zip de ton application et j'y jette un coup d'oeil ![]()
Oui tiens, tu peux y jeter un coup d’œil.
https://mega.co.nz/#!jccUmaCS!F0-W8idVWusSKTDkDz4FqD4zQCl35_6DPYZJUzGlNYM
Trouvé
C'était pas évident sur les screens surtout que j'ai pas l'habitude d'utiliser les namespace, mais avec un petit var_dump dans l'autoload on comprend vite ce qui ne va pas.
Il charge correctement "Applications\Frontend\FrontendApplication" mais ensuite il essaie de charger Applications\Frontend\Library\Application (qui n'existe pas).
Dans ton fichier FrontendApplication comme tu utilise le namespace Applications\Frontend, si tu appelles une autre classe sans la commencer par un antislash, il ira la chercher dans le namespace actuel.
Ensuite ta classe HTTPResponse est dans un fichier "HTTPResponse.calss.php", je te laisse trouver l'erreur de frappe dans le nom.
Dans ta classe Application tu instancie (ligne 18 et 19) un User et une Config sans leur passer $this en paramètre.
Dans ta classe Route:
public function setVarsNames(array $varsNames)
{
return $this->varNames;
}
De un c'est un setter, il est censé vérifier $varsNames et modifier $this->varsNames, pas le retourner.
De deux $this->varNames n'existe pas (il manque un s à vars).
Ta classe NewsController doit être dans un fichier NewsController.class.php et pas juste NewsController.php.
Après tu instancie la classe Managers depuis BackController (ligne 17) alors que c'est une classe abstraite, je te laisse corriger ça en suivant le tuto... tu devrais peut-être faire une classe qui étende Managers pour ta connexion en BDD.
Après bien sûr j'ai pas la BDD donc j'ai une erreur de connexion, mais ça fait déjà pas mal de débug là.
Notes aussi que ton NewsController étend BackController alors qu'il est dans le dossier Frontend, je ne suis pas sûr que ce soit le comportement voulu.
J'ai pas regardé la partie backend, mais tu devrais être plus vigileant lorsque tu codes (un antislash manquant, un s en moins, un .class à rajouter, etc...), et surtout fouiller un peu d'après les erreurs de PHP. N'hésites pas à mettre des var_dump de partout si besoin.
Notes aussi qu'il y a la fonction debug_backtrace() qui peut être intéressante, par exemple dans l'autoload:
if (!file_exists('../'. str_replace('\\', '/', $class). '.class.php'))
{
var_dump(debug_backtrace());
}
Ça te permet de savoir tous les fichiers qui ont été appelés depuis le début (donc de savoir qui a instancié la classe qui n'a pas été trouvée). ![]()
Je te remercie encore pour ton aide.
Cependant, j'ai corriger toutes les (grosses) erreurs que tu as relevé, cependant mon problème persiste et signe.
Mes variables ne sont toujours pas reconnues dans mon layout ainsi que toutes les classe mères.
Je n'y comprend plus rien .
De plus j'arrive pas à faire des var_dump().
Quand je fais
$variable = new Class();
var_dump($variable);
Soit il ne se passe rien, soit il y a des erreurs.
As-tu de ton côté , réussi à faire reconnaître les classes mères ?
Oui, ça m'aurait généré des erreurs sinon... tu utilise quoi comme serveur local ?