8768 sujets

Développement web côté serveur, CMS

Salut salut

j'ai un soucis, qui survient assez souvent dans mon processus de migration symfony (3 vers 5).

Actuellement dans symfony 3 les devs avaient appelé les services par

$serv = $this->container->get('app.monService');


maintenant dans symfony 5 c'est différents, on passe par l'injection de dépendance.

Ma question repose sur ce principe :

Pour faire de l'injection de dépendance pas de soucis

Mais quand c'est dans une sous sous fonction je trouve ça pénible de devoir faire l'injection de dépendance dans la fonction parente pour transfrerer mon service dans ma sous fonction.

Ex :

function indexAction (MonServiceQueJinjecte $service)
{
     $this->functionA($service)
}

public functionA ($service)
{
 // utilisation de mon service
}


Le problème c'est que si je veux ajouter un nouveau service dans functionA je suis obligé de re-travailler chaque endroit où il est appellé.


Donc voila, je suis obligé de faire l'injection de dépendance dans mon indexAction pour transférer mon service injecté dans ma functionA

N'y a t'il pas un moyen de faire l'injection directement dans functionA() ?

Car imaginer quand dans ma functionA j'ai une autre méthode, etc.. etc.. je suis à chaque fois obliger de mon trimballer mon service pour l'injecter aux fonctions enfants....

J'espère être clair... pas sûr...
merci de votre aide.
Modifié par JENCAL (15 Mar 2022 - 10:22)
Modérateur
Bonjour,

c'est succinct en effet et je ne suis pas sur d'avoir compris, et de plus ne connaissant pas symfony. Mais si tu passais tes services via un tableau, tu pourrais vraisemblablement boucler dessus et en passer plusieurs à la fois sans plus avoir à te soucier de tout remettre à jour à chaque fois que tu ajoute/enlève un truc. J’espère pour le coup que tu comprend l'idée, n'ayant pas non plus le vocabulaire de développeur, il y a surement un mot pour décrire ça Smiley cligne

Cdt
Salut,

n'ayant regarder ça que de très très loin, je risque de répondre à coté mais bon je tente quand même Smiley lol ...

Au lieu de faire descendre le service plus bas au fur et a mesure que tu en as besoin, je pensais que tu devais faire l'injection plus haut, au niveau de la class. Dans le constructeur, tu ajoutes un tableau pour stocker les services que tu injectes et tu peux t'en servir plus bas directement où tu veux vu qu'ils sont stockés au niveau de ton objet.
Bonjour,

Oui, je pense que la bonne façon de faire est d'injecter le service dans ton constructeur.
Tu n'as pas besoin d'un tableau dans symfony, tu injectes directement ton service et le framework sait comment l'instancier :

ex (en php8 avec la promotion de la propriété du constructeur) :


public function __construct(private MonServiceQueJinjecte $service){}

public functionA()
{
    $this->service->maMethode();
}


le même en déclarant le service comme private (php 7.x) :


private $service;

public function __construct(MonServiceQueJinjecte $service)
{
    $this->service = $service;
}
Merci pour vos réponse, oui je pourrais passer par un constructeur si j'étais dans un contexte de service. Et cela fonctionne!

Le problème c'est que cela se situe au niveau des controlleurs Smiley decu donc pas de _construct() !

Je continue de chercher sans succès
Modifié par JENCAL (16 Mar 2022 - 11:51)
Salut JENCAL,

Je remonte ce sujet car je le trouve intéressant Smiley cligne Le concept d'injection de dépendance est beaucoup utilisé dans tous les grands frameworks. C'est important selon moi, de bien le comprendre quand on travaille avec.

Donc la solution c'est effectivement de déclarer tes dépendances dans le constructeur. Mais c'est pas tout. Tes contrôleurs doivent être déclarés en tant que services et étendre la classe AbstractController. La documentation officielle dit :
a écrit :
In Symfony, a controller does not need to be registered as a service. But if you're using the default services.yaml configuration, and your controllers extend the AbstractController class, they are automatically registered as services. This means you can use dependency injection like any other normal service.

Ensuite le tour est joué. Let me know Smiley smile
Modifié par Anymah (20 Mar 2022 - 21:52)
Merci encore pour vos réponses...

Bah je pensé pas que je pouvais mettre un constructeur dans mes controller, c'est une bonne nouvelle. Et oui Anymah, effectivement j'étends bien sûr AbstractController:)

je vais tester tout ça !