IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

sessionStorage et forward() depuis une classe de routing


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    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:
    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.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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 ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Par défaut
    En gros j'ai juste ajouté un array que j'utilise pour faire mon forward.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
          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.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Par défaut
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/02/2013, 20h23
  2. Réponses: 4
    Dernier message: 08/03/2006, 19h07
  3. acces a uneressource bitmap depuis une classe
    Par firejocker dans le forum MFC
    Réponses: 9
    Dernier message: 03/02/2006, 21h48
  4. Réponses: 14
    Dernier message: 15/12/2005, 18h46
  5. Référence à un objet existant depuis une classe
    Par Adrenalys dans le forum ASP
    Réponses: 2
    Dernier message: 21/07/2005, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo