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.