Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/02/2011, 18h10   #1
Invité de passage
 
Inscription : août 2008
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : août 2008
Messages : 12
Points : 2
Points : 2
Par défaut sessionStorage et forward() depuis une classe de routing

Bonsoir,

En voulant créer un router interne pour économiser de la place dans routing.yml, j'ai rencontré un problème assez étrange.

Le contexte:

Dans le routing j'ai une déclaration de la route vers l'affichage des articles:
listArticles:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
  url: /articles/:showBy/:somethinkId/:somethinkName/:page/:sortBy/:sortType
  param: {module: Articles, action: ShowDefault}  
  class: mRouteClass
  requirements:
    showBy: (ville|type)
    somethinkId: \d+
    somethinkName: \S+
    page: \d+  
    sortBy: \S+
    sortType: (desc|asc)
L'url du type http://domaine.com/articles/ville/2/...se/1/title/asc est traité par mon router mRouteClass. Dedans la méthode matchersUrl() traite cette requête.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function matchesUrl($url, $context = array()) 
  {  
    $parameters = parent::matchesUrl($url, $context); 
	if(count($parameters) > 1) 
	{
	  $action = $parameters['action'];  
      foreach($parameters as $p => $parameter) 
	  { 
	    sfContext::getInstance()->getRequest()->setParameter($p, $parameter); 
	  }  
	  sfContext::getInstance()->getRequest()->setParameter('setRender', 1);  
      sfContext::getInstance()->getController()->forward($this->routesMap[$action][$parameters['showBy']]['module'], $this->routesMap[$action][$parameters['showBy']]['action']); 
    }  
	return $parameters;	
  }
Vers la fin elle "forwarde" la requête vers l'action définie (dans notre cas ce sera l'action News et la méthode ListNews). Elle est bien appelée. Le router marche correctement.

Le problème commence quand je tenter de récupérer les données des utilisateurs connectés. Quand j'initialise la session, je reçois un message d'erreur:
Citation:
Argument 2 passed to sfBasicSecurityUser::initialize() must be an instance of sfStorage
Quand je tente à récupérer l'id de l'utilisateur connecté, là aussi je reçois un message d'erreur:
Citation:
Call to a member function getAttribute() on a non-object
Est-ce que vous auriez une idée de l'origine du problème avec la session qui ne passe pas avec le forward ?

Cordialement.
trefle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 08h39   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Un des modules que je n'ai jamais démonté...

Par contre, pourquoi créer une classe particulière, vu la déclaration c'est dans les cordes de la classe de base.

Tu donnes une méthode, est-ce ce que tu as modifié ? As-tu modifié autre chose ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 20h32   #3
Invité de passage
 
Inscription : août 2008
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : août 2008
Messages : 12
Points : 2
Points : 2
En gros j'ai juste ajouté un array que j'utilise pour faire mon forward.

Code :
1
2
3
private $routesMap = array('ShowDefault' => 
    'ville' => array('module' => 'Cities', 'action' => 'ShowNews'),
    'type' => array('module' => 'Tymes', 'action' => 'ShowNewsTypes'))  );
Quand tu regardes le fragment que j'ai collé dans le premier message, je récupère ces éléments avec :

Code :
      sfContext::getInstance()->getController()->forward($this->routesMap[$action][$parameters['showBy']]['module'], $this->routesMap[$action][$parameters['showBy']]['action']);
Côté utilité. Je me suis aperçu que dans le routing.yml il y avait des liens très ressemblants les uns les autres. J'ai décidé d'enlever une vingtaine des lignes et de gérer le cas de ces chemins avec ma classe. Tout marchait, sauf le sauvegarde de la session.

Bien cordialement.
trefle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 09h25   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Je ne suis pas sur d'en voir l'intérêt mais le code me semble bon. Et au bon endroit.

Il n'y a pas de lien entre la session et le système de routage.

Essaye de changer le nom du cookies de session pour chacune de tes applications, par défaut il s'appelle symfony et cela peut créer des conflits entre le frontend et le backend. L'erreur vient peut-être d'un télescopage entre les deux dans ta méthodologie de test. Peut-être. Hors cela, le cookie de session est vu pour le domaine (toujours par défaut) dont une modification des routes, dans qu'elle ne touche pas le nom du domaine, ne devrait pas l'affecter.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 18h39   #5
Invité de passage
 
Inscription : août 2008
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : août 2008
Messages : 12
Points : 2
Points : 2
J'ai bien distingué la session pour le front et le backend. J'aurais parié sur quelque chose lié à la mauvaise initialisation du contexte. Mais pour l'instant il faut que j'avance avec le projet. Je laisserai donc la version "longue", avec plusieurs déclaration des routes. Car l'intérêt était là - de pouvoir mettre une seule route au lieu des deux.

Mais merci quand même. Si je trouve la réponse un jour, je la posterai ici
trefle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h40.


 
 
 
 
Partenaires

Hébergement Web