Bonjour,

Je suis la formation de grafikart mise en pratique POO arrivé à la première vidéo administration du blog je pense avoir un soucis avec php-di qui ne parviens pas à me charger une instance de mon ContainerInterface. Je ne comprends pas bien ce que veut dire Grafikart quand il dit que "php-di aurait deja injecter par rapport à a clé ContainerInterface le container". Comment vérifier que c'est bien le cas ?

Ce que je fais

Function __construct de mon BlogModule

public function __construct(ContainerInterface $container)
    {
        $container->get(RendererInterface::class)->addPath('blog', __DIR__ . '\views');
        $router = $container->get(Router::class);
        $router->get($container->get('blog.prefix'), BlogAction::class, 'blog.index');
        $router->get($container->get('blog.prefix').'/{slug:[a-z\-0-9]+}-{id:[0-9]+}', BlogAction::class, 'blog.show');

        if ($container->has('admin.prefix')) {
            $prefix = $container->get('admin.prefix');
            $router->get("$prefix\posts", AdminBlogAction::class, 'admin.blog.index');
        }
    }

Fichier config au niveau du Blog

use App\Blog\BlogModule;
use function DI\object;
use function DI\get;

return [
    'blog.prefix' => '/blog'
    ];

Fichier config au niveau de l'Admin

<?php

return [
    'admin.prefix' => '/admin'
];

Ce que je veux

Je cherche donc à afficher ma page d'administration et comprendre comment je peux vérifier que php-di à bien injecter le container par rapport à la clé ContainerInterface

Ce que j'obtiens

Fatal error: Uncaught DI\Definition\Exception\DefinitionException: Entry "App\Blog\BlogModule" cannot be resolved: Entry "Psr\Container\ContainerInterface" cannot be resolved: the class is not instantiable Full definition: Object ( class = #NOT INSTANTIABLE# Psr\Container\ContainerInterface scope = singleton lazy = false ) Full definition: Object ( class = App\Blog\BlogModule scope = singleton lazy = false __construct( $container = get(Psr\Container\ContainerInterface) ) ) in C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Exception\DefinitionException.php:16 Stack trace: #0 C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Resolver\ObjectCreator.php(154): DI\Definition\Exception\DefinitionException::create(Object(DI\Definition\ObjectDefinition), 'Entry "App\Blog...') #1 C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Resolver\ObjectCreator.php(70): DI\Definition\Resolver\ObjectCreator->createInstance(Object(DI\Definition\ObjectDefinition) in C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Exception\DefinitionException.php on line 16

Je me suis pourtant rensiegner et est essayé d'activer manuellement l'autowiring mais rien n'y fait toujours la même erreur. Je me suis pourtant documenté pour essayer de trouver un autre moyen d'implémenter le ContainerInterface mais rien de concluant.
Après plusieurs jours de recherches je sèche.

3 réponses


Abels667
Auteur
Réponse acceptée

Je n'ai finalement pas trouvé de solutions et suis repartis de zero à partir des sources.
Merci à ceux qui ont essayé de l'aider sur discord notamment.

Abels667
Auteur

J'ai essayé de remplacer le ContainerInterface par une instance qui implémente le ContainerInterface mais à la récupération de la page qui liste les articles administrable c'est la 404.
De plus mon ide s'affole lorsque je passe en paramètre le Container de php-di

Abels667
Auteur

J'ai également réessayer avec une autre méthode qui consiste à ajouter cette ligne de codedans mon index.php

$container->set(ContainerInterface::class, $container);

mais pareil c'est la 404 quand il s'agit d'accéder à la partie administration.
J'ai pourtant la bonne architecture de dossier je me suis refait le chapitre sur le renderer pour essayer de comprendre et par la même occasion le tutoriel sur php-di mais je ne trouves toujours pas de solutions.