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 :

Exécuter une fonction quelle que soit la route [2.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Février 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut Exécuter une fonction quelle que soit la route
    Bonjour tout le monde,

    Je débute avec SF2 et je me pose la question suivante :
    Comment peut-on faire pour executer une fonction à chaque fois qu'une page (une route) est affichée.

    Par ex : Enregistrer l'ip d'un user et l'heure d'ouverture de session (qu'il arrive sur n'importe quelle page)

    1/ L'utilisateur arrive sur example.com/foor/bar
    2/ Une session est ouverte et il n'a pas encore été logué
    3/ On logue son ip et l'heure via un bundle (persist en DB)
    4/ On indique en session qu'il a été logué
    5/ On continue l'exécution classique de la route foo/bar
    6/ L'utilisateur clique sur un lien example.com/anotherfoo
    7/ On check en session et on constate qu'il a été logué, on zappe donc l'enregistrement de l'ip et de l'heure
    8/ On continue l'exécution classique.

    Dans un deuxième temps, ce serait bien de ne pas loguer les utilisateurs inconnus si ils arrivent par example sur des url contenant /xml ou d'autres termes prédéfinis.

    D'avance merci pour vos conseils.
    Je n'ai pas encore écrit de code pour cette fonctionnalité étant donné que je ne sais pas par ou commencer ... mis a part la création d'un bundle qui ferait l'enregistrement.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    si tu souhaites exécuter ce traitement à chaque fois qu'un user est loggé, tu dois déclarer un AuthenticationSuccessHandler et le brancher sur le SecurityBundle.
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Février 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    @pc.bertineau

    Quand je dis "loggé" je veux dire par la que sa visite est enregistrée en DB (ip & heure). Pas qu'il est authentifié par login/pass.

    L'inconnue pour moi est de savoir commet et surtout ou effectuer une telle action pour ne pas répéter la vérification et l'enregistrment (si nécessaire) dans chacun de mes controleurs.
    Quand je suis dans le controleur, il est déjà trop tard. J'aimerais effectuer l'action de logging en DB avant d'être branché sur un controleur.

  4. #4
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Ce que tu cherches à faire est très simple.

    Construit un service avec une méthode qui fait ce que tu veux. Puis dans la définition du service dans ta configuration, rajoute le tag kernel.event_listener, et tu dois écouter sur l'événement kernel.controler (juste avant que le controleur ne s'exécute).

    Un exemple de la définition de ton service pourrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        asso_am.asso_selector:
            class:     Asso\AMBundle\Listener\AssoSelectorListener
            arguments: [@session, @security.context, @router]
            tags:
                - { name: kernel.event_listener, priority: -256, event: kernel.controller,          method: onKernelController }
    Tu l'as compris, la méthode de ton service qui est exécutée lors de l'événement est onKernelControler (comme défini à la dernière ligne).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Février 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    @winzou

    Merci !

    Grâce à ton exemple et à la doc de Symfony, j'ai pu avancer d'un pas mais il me reste encore quelques inconnues.

    Voici ce que j'ai fait :

    Dans Logging/UserBundle/Ressources/Config/services.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    parameters:
        logging_user.class: Logging\UserBundle\ControllerListener
     
    services:
        logging_user.example:
            class: %logging_user.class%
            arguments: [@session, @security.context, @router]
            tags :
              - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    Et dans Logging/UserBundle/ControllerListener
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    namespace Logging\UserBundle;
     
    use Symfony\Component\EventDispatcher\Event;
    use Symfony\Component\HttpKernel\HttpKernelInterface;
    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
    use Logging\UserBundle\Entity\User;
     
     
    class ControllerListener
    {
     
        protected $session;
     
        protected $securitycontext;
     
        protected $router;
     
        public function __construct($session, $securitycontext, $router)
        {
            $this->session = $session;
            $this->securitycontext = $securitycontext;
            $this->router = $router;
        }
     
        public function onKernelController()
        {
            $usertoken = $this->session->get('token');
            if(empty($usertoken)) {
                $user = new User();
                $user->setIp('192.168.1.10');
                $this->session->set('token', sha1($user->getIp()));
             }
        }
    }
    Dans le profiler, je vois bien que onKernelController est appelée et que la variable 'token' existe bien en session, donc on passe bien par là, c'est cool

    Il me reste les points d'interrogations suivants :
    (j'ai cherché dans la doc et sur le net mais ... )

    1/Comment récupérer l'ip du client ?
    L'ip se trouve dans la Request mais comment y accéder ?
    J'ai tenté de rajouter @request dans les params yml mais j'ai une erreur.

    2/Comment récupérer l'entitymanager pour pouvoir persister mon $user en DB ?

    3/ Ai-je vraiment besoin de security.context et router ?

  6. #6
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Mon code était un exemple, tu peux le personnaliser à souhait

    arguments: [@doctrine.entity_manager, @request]

    T'as quoi comme erreur quand tu mets request ? Une histoire de scope ? J'ai plus la syntaxe sous la main, mais il faut rajouter scope: request dans la définition de ton service, enfin qqch comme ca.

    Pour l'ip elle se trouve dans les server parameters de la requete, essaie $request->server->get('REMOTE_ADDR') ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Février 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    @winzou

    Un grand merci, tu cartonnes !

    Oui j'avais un souci de scope lorsque je rajoutais "request" dans les arguments... et il faut effectivement rajouter scope: request dans la définition.

    Existe t-il une liste des arguments symfony que l'on peut passer ?

    Si ca peut aider des devs, voici le code.

    Dans Logging/UserBundle/Ressources/Config/services.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    parameters:
        logging_user.class: Logging\UserBundle\ControllerListener
     
    services:
        logging_user.example:
            class: %logging_user.class%
            arguments: [@session, @doctrine.orm.entity_manager, @request]
            scope: request
            tags :
              - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    Et dans Logging/UserBundle/ControllerListener
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    namespace Logging\UserBundle;
     
    use Symfony\Component\EventDispatcher\Event;
    use Symfony\Component\HttpKernel\HttpKernelInterface;
    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
    use Logging\UserBundle\Entity\User;
     
     
    class ControllerListener
    {
     
        protected $session;
     
        protected $entitymanager;
     
        protected $request;
     
     
        public function __construct($session, $entitymanager, $request)
        {
            $this->session =       $session;
            $this->entitymanager = $entitymanager;
            $this->request =       $request;
        }
     
        public function onKernelController()
        {
            $usertoken = $this->session->get('token');
            if(empty($usertoken))
            {
                $user = new User();
                $user->setIp($this->request->getClientIp());
                $user->setUrl($this->request->getUri());
                $this->entitymanager->persist($user);
                $this->session->set('token', $user->getToken());
                $this->entitymanager->flush();
             }
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2014, 14h59
  2. Exécuter une fonction que si onmousedown et onmousemove sont actionnés
    Par xess91 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 06/01/2010, 17h05
  3. [Débutant]Comment exécuter une fonction tous les jours
    Par pseudomh dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/06/2006, 16h10
  4. Est-il possible d'exécuter une fonction à partir de fichier
    Par magic8392 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 16/09/2005, 13h59
  5. [VB.NET] Exécuter une fonction VB sur un Datagrid
    Par MiJack dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/09/2004, 14h45

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