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 :

Récupérer la session en dehors des controleurs


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2013
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 25
    Par défaut Récupérer la session en dehors des controleurs
    Bonjour,

    Je travaille actuellement sur un projet Symfony 2.

    Ce dernier est composé bien sûr de Controller et de couches métiers appelées par les Controllers.
    Ces couches métiers sont des classes des plus classique permettant essentiellement l'accès au données de la bdd.

    Le code ressemble en fait à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class DefaultController extends Controller
    {
          public function indexAction()
        {
             ....
             ProjectBLL::insertProject($projectBO);
             TaskBLL::insertTask($taskBO);
             ....
         }
    }
    Dans mes couches métiers lors de l'insertion en base d'un projet (ou d'une tâche) je désire aussi insérer une ligne d'historique dans une table dédiée.
    Dans cet historique je désire stocker l'identifiant de l'utilisateur courant à l'origine de l'action, en l’occurrence un identifiant stocker dans la session.

    Dans mes controlleurs pas de problème pour récupérer cet identifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->get("request")->getSession()->get("idUser");
    Comment puis-je récupérer la valeur de cette session dans mes couches métiers sans avoir à le passer en paramètre à mes méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProjectBLL::insertProject($projectBO, $idUser);
    En d'autres termes comment avoir accès à ma session en dehors du controlleur ?

    Par avance je vous remercie pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Apprenti chef de projet / Développeur
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti chef de projet / Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Par défaut
    Tu peux définir ton controller en temps que service et lui injecter le "securityContext" comme ça tu aura accès à l'utilisateur courant dans celui-ci.

    En espérant t'avoir aidé ..

  3. #3
    Membre averti
    Inscrit en
    Février 2013
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 25
    Par défaut
    skududufru merci pour cette première réponse.

    Pour des raisons sous-jacentes je n'utilise pas la couche de Symfony pour gérer ma session utilisateur.
    Je possède une authentification maison qui stocke mon objet 'User' (dont son identifiant) dans une session particulière.

    Mes contrôleurs (MVC) ont sans problème accès à cette session en passant directement par l'objet "request".
    Dans mes couches métier (MVC) qui ne sont pas des contrôleurs mais des méthodes me permettant de faire des INSERT, UPDATE, DELETE dans ma base de données.

    Dans ma base de données je stocke souvent l'identifiant de mon utilisateur courant.
    Et au lieu de devoir le passer en paramètre systématiquement de mon contrôleur vers mon modèle j'aurai aimé pouvoir le récupérer directement de mon modèle.

  4. #4
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    En admettant que la méthode que tu utilises pour le stockage d'un user en session soit justifiée, tu peux récupérer la session par injection de dépendance.

    Selon ce dont tu as besoin tu peux injecter le service @session ou si tu veux la récupérer comme dans ton exemple depuis la requête : tu peux y accéder en injectant le service @request_stack (>=2.4).

    ++

  5. #5
    Membre averti
    Inscrit en
    Février 2013
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 25
    Par défaut
    Bonjour Nico_F,

    Oui effectivement mes investigations m'ont mené à cette notion d'"injection de dépendance" mais je n'arrive pas à saisir comment cela fonctionne même après avoir parcouru les tutoriaux de Symfony.

    Le service "@request_stack" peut-il être utilisé dans mes couches métier "ProjectBLL", "TaskBLL" même si ces dernières ne sont pas des contrôleurs ?
    Si oui je n'ai pas trouvé comment instancier dans mes couches métier ce service afin d'avoir accès à l'objet "request" ?

    Je sens que j'approche du but... mais un doute persiste sur la faisabilité...
    Je te remercie donc par avance pour les informations complémentaires que tu pourrais m'apporter

  6. #6
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    De nombreuses classes peuvent être déclarées en tant que service et c'est une bonne chose de le faire si tant est que tu gardes une cohérence sur l'ensemble de ton modèle.
    Tu peux déclarer un controlleur en tant que service, mais aussi un manager, un repository, un formHandler, un subscriber ... n'importe quelle classe custom de ton choix.

    Donc je ne sais pas ce que sont tes classes PLL mais s'il ne s'agit pas d'entités Doctrine, il n'y a à priori pas de raison pour que tu ne puisses pas les déclarer en tant que service.

    En reprenant le même fonctionnement que la déclaration des services des contrôleurs, tu peux déclarer la classe de ton choix en tant que service, et lui passer en argument d'autres services.

    Première lecture => http://symfony.com/fr/doc/current/co...roduction.html

    ++

  7. #7
    Membre averti
    Inscrit en
    Février 2013
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 25
    Par défaut
    C'est là que je perds le file... J'ai peur de ne pas comprendre ce qu'est un service Symfony...

    Actuellement j'ai essayé :

    1. Déclaration de ma classe en tant que service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    session_service:
            class: ItmBundle\Services\SessionService
            arguments: ["@request_stack"]
    Ici je pense déclarer ma classe SessionService en tant que service et que cette dernière prend en argument l'objet request_stack

    2. Implémentation de ma classe :

    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
    16
    17
    18
    19
     
    namespace ItmBundle\Services;
     
    class SessionService
    {
    	private $_requestStack;
    	public function __construct(RequestStack $requestStack) {
    		$this->_requestStack = $requestStack;
    	}
     
    	public function getUserId(){
        	    $currentRequest = $this->_requestStack->getCurrentRequest();
    	    $session = $currentRequest->getSession();
        	    if ($session->has("User")) {
    	    	$ret = $session->get("User")->getId();
    	    }
        	return $ret;
        }
    }
    Je pense ici que ma classe étant un service le constructeur va automatiquement utiliser le paramètre @request_stack pour créer mon instance...
    Ce n'est pas le cas...

    En effet dans ma classe ProjectBLL, classe effectivement non Doctrine mais classe standard, pour récupérer l'identifiant de mon utilisateur j'ai une erreur lorsque je fais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class ProjectBLL {
        ...
        ...
        $sessionService = new SessionService();
        $idCurrentUser = $sessionService->getUserID();
        ...
        ...
    }
    ... me retourne bien entendu l'erreur que le constructeur attend un argument (à priori le @request_stack que je ne précise pas car je ne connais pas ici)...

    Peux-tu me dire ou je me plante dans la mécanique car je sens bien que quelquechose m'a échappé...

    En te remerciant par avance

Discussions similaires

  1. les sessions en dehors des applications web
    Par paonus dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/07/2008, 09h19
  2. [EJB Stateful] récupérer les sessions des utilisateurs
    Par robert.tari dans le forum Java EE
    Réponses: 4
    Dernier message: 07/12/2007, 10h50
  3. Session en dehors des servlets
    Par batataw dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 19/10/2007, 13h00
  4. [Sessions] Comment creer des sessions pour chaque visiteur
    Par developower dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2005, 12h55
  5. [servlet]récupérer la session
    Par deldin dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 09/08/2004, 19h04

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