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 :

envoyer une notification depuis une methode de listener [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut envoyer une notification depuis une methode de listener
    salut
    j'ai crée un listener qui ecouter un evenement declanché a la creation de nouveau panne
    le code de listener et ceci:
    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
     
    <?php
     
    // src/Gestion/gestionBundle/Bigbrother/CensureListener.php
     
    namespace Gestion\gestionBundle\Bigbrother;
     
    use Gestion\gestionBundle\Bigbrother\MessagePostEvent;
     
    class CensureListener
    {
    	protected function censureMessage($message)
    	{
            $this->get('session')->getFlashBag()->add('notice', $message);
    	}
    	public function onMessagePost(MessagePostEvent $event)
    	{
    	$this->censureMessage($event->getMessage());
    	}
    }
    mais j'ai obtenu l'erreur suivant:

    Attempted to call method "get" on class "Gestion\gestionBundle\Bigbrother\CensureListener" in /home/mostafa/Symfony/src/Gestion/gestionBundle/Bigbrother/CensureListener.php line 14.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 98
    Points : 163
    Points
    163
    Par défaut
    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
     
    <?php
     
    // src/Gestion/gestionBundle/Bigbrother/CensureListener.php
     
    namespace Gestion\gestionBundle\Bigbrother;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Gestion\gestionBundle\Bigbrother\MessagePostEvent;
     
    class CensureListener extends Controller
    {
    	protected function censureMessage($message)
    	{
            $this->get('session')->getFlashBag()->add('notice', $message);
    	}
    	public function onMessagePost(MessagePostEvent $event)
    	{
    	$this->censureMessage($event->getMessage());
    	}
    }
    petit probleme d'héritage

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    oui j'ai essayé par ce truc mais j'obtient cette erreur:
    Error: Call to a member function get() on a non-object in /home/mostafa/Symfony/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php line 274

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 98
    Points : 163
    Points
    163
    Par défaut
    C'est un probleme d'injection de dépendances, t'as le container n'est pas injecté, rien de bien méchant, dans ton service il faut une petite modif rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    calls:
                - [setContainer, ["@service_container"]]

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    merci beaucoup ça marche

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    C'est du n'importe quoi ! Réveillez vous !

    Garniture pourquoi hériter Controller dans un Listener ? au pire si il a besoin du container il hérite ContainerAware !

    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
     
    <?php
     
    namespace Gestion\gestionBundle\Bigbrother;
     
    use Symfony\Component\DependencyInjection\ContainerAware;
     
    class CensureListener extends ContainerAware
    {
        protected function censureMessage($message)
        {
            $this->getSession()->getFlashBag()->add('notice', $message);
        }
     
        public function onMessagePost(MessagePostEvent $event)
        {
            $this->censureMessage($event->getMessage());
        }
     
        public function getSession()
        {
            return $this->get('session');
        }
    }
    Mais quand on a besoin uniquement du service 'session' on injecte que ce dernier !

    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
     
    <?php
     
    namespace Gestion\gestionBundle\Bigbrother;
     
    class CensureListener
    {
        /**
         * @var \Symfony\Component\HttpFoundation\Session\Session
         */
        protected $session;
     
        /**
         * @param \Symfony\Component\HttpFoundation\Session\Session $session
         */
        public function __construct(\Symfony\Component\HttpFoundation\Session\Session $session)
        {
            $this->session = $session;
        }
     
        protected function censureMessage($message)
        {
            $this->getSession()->getFlashBag()->add('notice', $message);
        }
     
        public function onMessagePost(MessagePostEvent $event)
        {
            $this->censureMessage($event->getMessage());
        }
     
        /**
         * @return \Symfony\Component\HttpFoundation\Session\Session
         */
        public function getSession()
        {
            return $this->session;
        }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    services:
        ton_listener:
            class:     Blablabla\...\TonListener
            arguments: ["@session"]

    Sur ce je vais boire un café !

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 98
    Points : 163
    Points
    163
    Par défaut
    En quoi la solution que j'ai proposé c'est du n'importe quoi ?
    En quoi créer un couplage fort entre Session et son entité Listener est bien ?

    La classe Controller extends de toutes façon de ContainerAware:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /**
     * Controller is a simple implementation of a Controller.
     *
     * It provides methods to common features needed in controllers.
     *
     * @author Fabien Potencier <fabien@symfony.com>
     */
    class Controller extends ContainerAware
    La solution que j'ai proposé coreespond à un design pattern service locator

    Si tu estimes que passer le container c'est tuer une mouche au bazooka, je comprends et j'accepte la remarque. En revanche dire que c'est du "n'importe quoi" tu vas un peu trop loin.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Tu sais, un jour on m'a conseiller de reconnaitre les erreurs que l'on dit; que l'on fait pour évoluer ....

    a) Qu'elle méthode du Controller utilises tu pour avoir besoin d'en hériter ?

    b) Coupler simplement avec Session permet de réutiliser la class dans un autre projet (Silex par exemple) et de pouvoir l'utiliser simplement avec le composant HttpFoundation (et EventDispatcher).



    http://richardmiller.co.uk/2011/06/1...se-controller/

    When you start learning Symfony2 using the book, you are introduced to the base controller. The base controller has some helpful methods to make common tasks easier. After a while though you may want to move away from extending this controller, in fact, it is the advised best practice for controllers in shared bundles. When you do, you will no longer have access to these useful methods, in this post I am going to look at how to accomplish the same tasks without them.
    Mais

    Injecting Services
    Now for the more controversial bit. In my opinion injecting the container in this way is not the correct way to use it. I have written about this in these posts: When Dependency Injection goes Wrong and In Defence of Dependency Injection Containers. This is not the opinion of everyone and not an official best practice, it is just my recommendation.

    Y'a quelques un de tes postes, qui m'on bien fait rire ( un sur le partage de session, un autre sur les path ...), je ne peux que te conseiller d'essayer de prendre les remarques des personnes bien plus expérimenté que toi comme des conseils !

  9. #9
    Membre expérimenté 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 : 36
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    J'avoue avoir du mal également à comprendre pourquoi un Listener hériterait d'un controller.
    C'est juste une histoire de logique : un contrôler et un listener sont deux objets radicalement différents qui n'ont aucune raison d'hériter l'un de l'autre.

    Autre chose : injecter le container est pour moi une pratique de fainéant qui masque les dépendances.

    Je suis globalement d'accord avec ce qu'a dit goabonga.

    La seule chose qui me chagrine un peu c'est que je ne suis pas vraiment convaincu par l'intérêt d'injecter l'objet session dans un listener juste pour afficher un flash message.
    Pour moi, cela fait partie des rares choses qui peuvent être traitées par le controller, mais à la limite ce n'est pas quelque chose de trop choquant.

  10. #10
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    bonjour
    j'ai utilisé le listener pour envoyer une flash message à une autre page que le controleur envoyer leurs données si non je peux faire ça evidament depuis le controleur espérant que j'ai bien expliquer la situation

  11. #11
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2015, 17h16
  2. Modifier une variable d'une classe depuis une autre classe
    Par Kezado dans le forum Général Java
    Réponses: 8
    Dernier message: 23/09/2010, 14h52
  3. [AC-2007] Copier une table depuis une base vers une autre
    Par Triton972 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/11/2009, 19h27
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02

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