Bonsoir.
Pourquoi est-ce que tu instancies renderer dans une propriété dans ta class BlogModule ?
Que je sache il ne le fait pas Grafikart dans cette vidéo, tout du moins pas à cette étape de la vidéo.
Bonjour,
Voila je rencontre un petit problème avec mon code.
Ce que je fais
BlogModule.php :
BlogAction.php
Décrivez ici votre code ou ce que vous cherchez à faire
C'est le code indiqué dans la vidéo https://www.grafikart.fr/formations/mise-pratique-poo/conteneur-dependance notamment à la 29' 41
Ce que je veux
Faire fonctionner la page comme indiqué dans la vidéo
Ce que j'obtiens
Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
Je ne comprend pas pourquoi le renderer n'est pas instancié...
Faut-il avoir un paramétrage spécifique dans PHP-DI pour le 'autowiring' ?
Car PHP-DI ne retrouve pas les éléments...
Merci pour votre aide.
11 réponses
Merci Lartak pour ta réponse,
Je ne le fais pas non plus. J'ai reproduit le code de Grafikart à la lettre.
Mais cela me renvoie l'erreur 'Call to a member function render() on null'.
Je cherche à comprendre pourquoi render est à null. Et ma première idée me dit que $renderer n'est pas connu. D'où l'idée de l'intancier...
L'autre piste, concerne une configuration spécifique de PHP-DI avec la fonction autowire() que j'aurais loupé dans les précédentes chapitres.
Il faut que tu spécifies à ton conteneur comment instancier la chaîne $prefix
Merci Gorgio de t'intéresser à la question.
La chaine $prefix est instanciée avant l'apparition du BlogAction. Voilà le fichier de config ds /blog/config.php :
Si je remets l'ancienne version de BlogModule (qui ne prend pas en compte BlogAction) :
Cela fonctionne correctement.
C'est bien l'introduction du BlogAction qui génére l'erreur.
Seul la fonction 'object()' est modifiée par 'autowire()' dans mon code par rapport à celui de Grafikart.
La fonction object() a été supprimé dans PHP-DI, maintenant remplacé par cette fonction.
C'est pourquoi je recherche du côté du autowire() si un paramétrage complémentaire doit être mis en place.
Si quelqu'un a la réponse... je suis preneur.
La question que je me pose c'est si le renderer est bien injecter dans le blog module en vrai, les messages d'erreurs de PHP-DI sont vraiment moisi je trouve
Hum !
Je partage ton point de vue...
Pour ma part, je suis les différentes vidéos de Grafikart pour gagner en compétence, mais j'avoue découvrir PHP-DI et beaucoup de choses. Je dois remercier Grafikart de nous faire partager ses connaissances.
Voila ce que j'ai trouvé : http://php-di.org/doc/autowiring.html
Dans certaines circonstances de dépendances la fonction autowire() gére lui-même l'instanciation des classes pour éviter de provoquer le message d'erreur (using the type hinting).
Pour plus de précisions sur le type 'hinting' : http://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
Limitation (un peu plus bas dans l'article) : La classe (ou une fonction propre à la classe) s'appelle elle-même.
La solution serait de configurer ce cas dans config.php
Intancier autowire() : http://php-di.org/doc/php-definitions.html
C'est là où je me perds un peu... car c'est ce que nous avons fait.
code de config.php
Pour info Code de TwigRendererFactory
J'ai fait le test en supprimant la dernière version de PHP-DI (6.0) et en installant la version 5.4.6.
J'obtiens la même erreur. J'ai donc bien une erreur au niveau de mon code... la fonction autowire() ne serait donc pas concerné...
J'ai réinstallé la version 6.0 de PHP-DI
Je n'ai pas trouvé pourquoi ce comportement et l'erreur obtenue.
Le code est identique à celui de Grafikart (ormis la fonction autowire).
Si quelqu'un a le même pb et/ou une idée à suivre, je suis preneur.
Je me permets de relancer le sujet.
Je suis toujours bloqué sur ce point.
Il est vrai que depuis quelques jours je n'ai pas eu le temps de revenir sur ce code...
J'ai ajouté un var_dump dans mon BlogModule :
et j'obtiens ceci :
J'aimerais avoir un retour d'expérience.
Merci