CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[PHP-POO]Passer variables dans layout

Pflimlin
Pflimlin
Niveau 9
23 janvier 2013 à 04:29:59

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.

vava740
vava740
Niveau 10
23 janvier 2013 à 13:41:33

J'ai juste jeté un coup d'oeil mais est-ce que $this->vars dans ta classe Page contient bien un offset "user" ?

deepblue
deepblue
Niveau 16
23 janvier 2013 à 14:27:25

Ligne 26 : $this->addVar('user', $this->app->user());

Pflimlin
Pflimlin
Niveau 9
23 janvier 2013 à 18:05:54

@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 :question:

vava740
vava740
Niveau 10
23 janvier 2013 à 18:43:56

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

Pflimlin
Pflimlin
Niveau 9
23 janvier 2013 à 20:16:38

J'ai rajouté la fonction :

public function user()
{
return $this->user;
}

mais j'ai toujours la même erreur :question:

vava740
vava740
Niveau 10
23 janvier 2013 à 21:48:34

Et le var_dump($user) avant le extract ?

Pflimlin
Pflimlin
Niveau 9
24 janvier 2013 à 02:55:15

J'ai essayé le var_dump et toujours rien :(

vava740
vava740
Niveau 10
24 janvier 2013 à 09:03:34

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 ?

deepblue
deepblue
Niveau 16
24 janvier 2013 à 15:28:14

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.

Pflimlin
Pflimlin
Niveau 9
27 janvier 2013 à 02:23:46

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()) :(

deepblue
deepblue
Niveau 16
27 janvier 2013 à 05:14:22

et il raconte quoi le var_dump ? http://php.net/var_dump histoire de comprendre ce que tu fais.

Pflimlin
Pflimlin
Niveau 9
27 janvier 2013 à 22:30:39

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

Vous avez une idée de ce que je dois faire pour que mes classes mère soient reconnues ? :-(

vava740
vava740
Niveau 10
28 janvier 2013 à 08:23:40

Vous avez une idée de ce que je dois faire pour que mes classes mère soient reconnues ? :-(

Revoir ton autoload ?

Pflimlin
Pflimlin
Niveau 9
29 janvier 2013 à 08:13:37

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() ?

vava740
vava740
Niveau 10
29 janvier 2013 à 14:32:42

$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 :(

Pflimlin
Pflimlin
Niveau 9
29 janvier 2013 à 19:06:41

Oui tiens, tu peux y jeter un coup d’œil.

https://mega.co.nz/#!jccUmaCS!F0-W8idVWusSKTDkDz4FqD4zQCl35_6DPYZJUzGlNYM

vava740
vava740
Niveau 10
30 janvier 2013 à 07:44:34

Trouvé :noel:

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

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

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

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

Pflimlin
Pflimlin
Niveau 9
31 janvier 2013 à 00:23:42

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 ?

vava740
vava740
Niveau 10
31 janvier 2013 à 09:15:23

Oui, ça m'aurait généré des erreurs sinon... tu utilise quoi comme serveur local ?

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment