[RESOLU] Injection de dépendance // ArgumentCountError

Mammouth du PHP | 19672 Messages

29 juin 2023, 10:56

Bonjour tout le monde,
si un expert Symfony passe dans les parages, j'ai un soucis qui me bloque depuis pas mal de temps.

Je m'auto-forme à Symfony depuis environ trois mois et je tâche de me construire un système sur la base de symfony mais en écartant deux éléments qui me sortent par les yeux, à savoir Doctrine et Twig.
Et pour l'instant ça fonctionne ... à un détail près. Le système d'injection de dépendances ne fonctionne pas du tout. Je fouille Internet depuis des semaines sans trouver ce que je cherche.

L'Environnement :
- Linux/Ubuntu;
- Apache 2.4
- PHP 8.1;
- Packages de Symfony en version 6.3;

Le blocage :
j'ai un contrôleur dans lequel j'ai ajouté un constructeur afin d' injecter trois services :

Code : Tout sélectionner

public function __construct(FormFactory $oFormFactory, DbrmFactory $oDbrm, RequestStack $RequestStack) { $this->_oFormFactory = $oFormFactory; $this->_oDbrm = $oDbrm; $this->_oPrm = new ParametresReferentiel($oDbrm); $this->_oUtl = new UtilisateurReferentiel($oDbrm); $this->_AuthenticationUtils = new AuthenticationUtils($RequestStack); }
L'Erreur obtenue :
Too few arguments to function App\Controleur\IdentificationController::__construct(), 0 passed in /var/www/Clients/merp/vendor/symfony/http-kernel/Controller/ControllerResolver.php on line 131 and exactly 3 expected
J'ai bien évidemment vérifié les services dans le fichier services.yaml, Et j'ai pourtant bien indiqué les éléments voulus :

Code : Tout sélectionner

services . . . app.fabrique.form: class: App\Fabrique\FormFactory: autowire: true app.fabrique.dbrm: class: App\Fabrique\DbrmFactory: autowire: true App\Controleur\IdentificationController: arguments: $oFormFactory: '@app.fabrique.form' $oDbrm: '@app.fabrique.dbrm' $RequestStack: '@Symfony\Component\HttpFoundation\RequestStack' autowire: true
Pour vérifier, je suis passé par la console avec deux voies :

Code : Tout sélectionner

$ php bin/console debug:autowiring fabrique --all Autowirable Types ================= The following classes & interfaces can be used as type-hints when autowiring: (only showing classes/interfaces matching fabrique) Gestion de l'accès aux données : fabrique pour l'utilisation du package jemdev\dbrm App\Fabrique\DbrmFactory Création de formulaires avec le package jemdev\form App\Fabrique\FormFactory Pro-tip: use interfaces in your type-hints instead of classes to benefit from the dependency inversion principle.
Ou encore :

Code : Tout sélectionner

$ php bin/console debug:container Symfony Container Services ========================== -------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- Service ID Class name -------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- . . . .. App\Fabrique\DbrmFactory App\Fabrique\DbrmFactory App\Fabrique\FormFactory App\Fabrique\FormFactory . . . . -------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- // To search for a specific service, re-run this command with a search term. (e.g. debug:container log)
En poussant un poil plus loin :

Code : Tout sélectionner

$ php bin/console debug:container fabrique Select one of the following services to display its information: [0] App\Fabrique\DbrmFactory [1] App\Fabrique\FormFactory [2] app.fabrique.form [3] app.fabrique.dbrm > 2 Information for Service "app.fabrique.form" =========================================== ---------------- ----------------------------------------- Option Value ---------------- ----------------------------------------- Service ID app.fabrique.form Class App\Fabrique\FormFactory: Tags - Public no Synthetic no Lazy no Shared yes Abstract no Autowired yes Autoconfigured yes Usages App\Controleur\IdentificationController ---------------- ----------------------------------------- ! [NOTE] The "app.fabrique.form" service or alias has been removed or inlined when the container was compiled.
Donc, j'ai dû louper un truc quelque part, et pas moyen de trouver quoi dans la documentation... toute piste de solution sera plus que bienvenue.

PS : ça fait très longtemps que je n'avais pas posté, je n'arrive pas à maintenir l'indentation dans le code, désolé, ça le rend nettement moins lisible.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

30 juin 2023, 06:47

Je relance un peu en soulignant un élément du dernier bloc de code du post précédent :

Code : Tout sélectionner

[NOTE] The "app.fabrique.form" service or alias has been removed or inlined when the container was compiled.
Par curiosité, j'ai fait la même vérification pour les deux autres paramètres attendus dans le contrôleur mentionné précédemment : même résultat pour les trois.

Le service ou l'alias a été retiré au moment de la compilation ?? Ha bon ??? Une idée sur ce qui peut bien avoir déclenché ceci ? Sinon, que signifie cette note ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

30 juin 2023, 11:41

Bon ben laissez tomber, j'ai enfin isolé le problème, et ça ne vient pas de l'injection de dépendance, mais du ControllerResolver qui déconne
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: