php-di n'arrive pas à instancier une class

Par Alex-trem, il y a 5 ans


Bonjour,

Je suis entrain de suivre le tuto Authentification et je recontre un problème avec le Middleware qui n'arrive pas à instancier la class Auth dont il a besoin pour sa construction.
Pourtant j'ai bien la config qui lui dit de passer par DatabaseAuth pour instancier Auth...

Ce que je fais

Config.php

<?php use App\Auth\DatabaseAuth; use App\Auth\ForbiddenMiddleware; use Framework\Auth; return [ 'auth.login' => '/login', 'twig.extensions' => \DI\add([ \Di\get(\App\Auth\AuthTwigExtension::class) ]), Auth::class => \DI\get(DatabaseAuth::class), ForbiddenMiddleware::class => \DI\autowire()->constructorParameter('loginPath', \DI\get('auth.login')) ];

LoggedInMiddleware

<?php namespace Framework\Auth; use Framework\Auth; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; class LoggedInMiddleware implements MiddlewareInterface { /** * @var Auth */ private $auth; public function __construct(Auth $auth) { $this->auth = $auth; } public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $user = $this->auth->getUser(); if (is_null($user)) { throw new ForbiddenException(); } return $handler->handle($request->withAttribute('user', $user)); } }

Ce que j'obtiens

Fatal error: Uncaught DI\Definition\Exception\InvalidDefinition: Entry "Framework\Auth\LoggedInMiddleware" cannot be resolved: Entry "Framework\Auth" cannot be resolved: the class is not instantiable Full definition: Object ( class = #NOT INSTANTIABLE# Framework\Auth lazy = false ) Full definition: Object ( class = Framework\Auth\LoggedInMiddleware lazy = false __construct( $auth = get(Framework\Auth) ) ) in C:\Users\perro\Documents\MonFramework\vendor\php-di\php-di\src\Definition\Exception\InvalidDefinition.php on line 18

( ! ) DI\Definition\Exception\InvalidDefinition: Entry "Framework\Auth\LoggedInMiddleware" cannot be resolved: Entry "Framework\Auth" cannot be resolved: the class is not instantiable Full definition: Object ( class = #NOT INSTANTIABLE# Framework\Auth lazy = false ) Full definition: Object ( class = Framework\Auth\LoggedInMiddleware lazy = false __construct( $auth = get(Framework\Auth) ) ) in C:\Users\perro\Documents\MonFramework\vendor\php-di\php-di\src\Definition\Exception\InvalidDefinition.php on line 18

9 réponses

Grafikart, il y a 5 ans

A quoi ressemble ? DatabaseAuth

Alex-trem, il y a 5 ans
<?php namespace App\Auth; use Framework\Auth; use Framework\Auth\User; use Framework\Database\NoRecordException; use Framework\Session\SessionInterface; class DatabaseAuth implements Auth { /** * @var UserTable */ private $userTable; /** * @var SessionInterface */ private $session; /** * @var \App\Auth\User */ private $user; public function __construct(UserTable $userTable, SessionInterface $session) { $this->userTable = $userTable; $this->session = $session; } // ... }
Hypario, il y a 5 ans

je suppose que DatabaseAuth ne peux pas être instancié car tu ne définie pas à PHP-DI comment lui fournir un objet qui implémente la SessionInterface

Alex-trem, il y a 5 ans

Si ça c'est dans la config placé à la racine du Framework.
J'ai quand même essayé de faire

Auth::class => \DI\create(DatabaseAuth::class)->constructor(UserTable::class, SessionInterface::class),

mais ça change rien...

Hypario, il y a 5 ans

nan mais, SessionInterface est une interface n'est-ce pas ? une interface n'est PAS instanciable, il te faut une class qui implémente cette interface

Antoine Scherrens, il y a 5 ans

je me trompe peut etre mais faut il pas mieux mettre

class DatabaseAuth implements SessionInterface

Alex-trem, il y a 5 ans

Hypario, je me suis posé la question en voyan Grafikart écrire ça mais bon apparemment là ça fonctionne pour lui.
J'ai essayé dans la sens inverse comme dit Antoine mais j'ai toujours le même problème :/

Antoine Scherrens, il y a 5 ans

de ce que j ai vu sur le net il n y as pas des configurations a faire dans un fichier yaml a tout hasard ??(je precise je ne connais pas encore symfony) si je me trompe pas tu essaye de mettre en place un systeme d authentification ? et de memoire on doit implementer toute les methodes d une interface meme si on s en sert pas on peut mettre les classes vides pour eviter les problemes je crois.

Alex-trem, il y a 5 ans

Je n'utilise pas symfony, je regarderai la suite de la formation je crois qu'il change la manière dont l'authentification fonctionne donc je reviendrai donner une réponse si je la trouve plus tard.
Merci pour vos réponses