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 :

Injection de dépendance et héritage


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 71
    Par défaut Injection de dépendance et héritage
    Bonjour,

    J'ai 3 services ServA, ServB et ServC. ServB et ServC héritent tous les deux de ServA.

    Lors de la construction d'une instance ServB ou ServC, j'ai besoin d'utiliser ContainerInterface ainsi qu'un deuxième objet, différent pour ServB que pour ServC. Par Exemple :

    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
    class ServA {
     
       protected $container;
    }
     
    class ServB extends ServA  {
       protected $a;
       function __construct(ContainerInterface $container, ObjetA $a) {
          $this->container = $container;
          $this->a = $a
       }
    }
     
    class ServC extends ServA {
       protected $a;
       function __construct(ContainerInterface $container, ObjetB $a) {
          $this->container = $container;
          $this->a = $a
       }
    }
    Pour des raisons principalement esthétiques (et parce que je suis allergique au copier-coller), j'aurai souhaité plutôt écrire ce genre de code :

    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
    class ServA {
       protected $container;
       function __construct(ContainerInterface $container) {
          $this->container = $container;
       }
    }
     
    class ServB extends ServA  {
       protected $a;
       function __construct(ObjetA $a) {
          $this->a = $a
       }
    }
     
    class ServC extends ServA {
       protected $a;
       function __construct(ObjetB $a) {
          $this->a = $a
       }
    }
    Par contre, il est évident que le container ne peut pas être initialisé ainsi.

    Pourriez-vous m'indiquer une syntaxe correcte afin d'arriver à profiter de l'autowire et d'éviter au maximum du copier-coller de code ?

    Merci,

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 71
    Par défaut
    Bonjour,

    Je me permets de remonter ce thread car le "problème" est toujours d'actualité.

    Bien que non bloquant, c'est assez pénible d'écrire dans chacune des méthodes __construct() des 25 sous-classes, la même injection du logger, de l'entitymanager et du swiftmailer et je suppose qu'il existe une méthode bien plus élégante que ce copier-coller.

    Vous remerciant par avance,

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 696
    Par défaut
    en PHP on peux appeler le constructeur du parent comme dans le code suivant :
    je n'ai pas testé ce code, c'est juste pour illustrer https://www.php.net/manual/fr/langua...ekudotayim.php

    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
    40
    class ServA {
    	protected $container;
     
    	function __construct(ContainerInterface $container, $logger, $entitymanager, $swiftmailer ) {
     
    		$this->container = $container;
    		$this->logger = $logger;
    		$this->entitymanager = $entitymanager;
    		$this->swiftmailer = $swiftmailer;
     
    	}
    }
     
     
    class ServB extends ServA  {
     
    	protected $a;
     
    	function __construct(ContainerInterface $container, $logger, $entitymanager, $swiftmailer, ObjetA $a) {
     
    		parent::_construct($container, $logger, $entitymanager, $swiftmailer);
     
    		$this->a = $a;
     
    	}
    }
     
    class ServC extends ServA {
     
    	protected $a;
     
     
    	function __construct(ContainerInterface $container, $logger, $entitymanager, $swiftmailer, ObjetB $a) {
     
    		parent::_construct($container, $logger, $entitymanager, $swiftmailer);
     
    		$this->a = $a;
     
    	}
    }

Discussions similaires

  1. [EJB3] [JBoss] Injection de dépendance circulaire ?
    Par Claythest dans le forum Java EE
    Réponses: 6
    Dernier message: 04/08/2009, 08h11
  2. [Framework] Injection de dépendances ; comment se passer du XML ?
    Par ummon99 dans le forum Spring
    Réponses: 3
    Dernier message: 12/01/2008, 09h19
  3. [EJB3] Injection de dépendance et Stateful
    Par newbeewan dans le forum Java EE
    Réponses: 1
    Dernier message: 15/05/2007, 07h33
  4. [Integration] [EasyMock] Injection de dépendance à l'éxécution
    Par frangin2003 dans le forum Spring
    Réponses: 2
    Dernier message: 06/03/2007, 11h06
  5. Spring + TagSupport et injection de dépendance
    Par worldchampion57 dans le forum Spring Web
    Réponses: 2
    Dernier message: 26/02/2007, 09h01

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