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...
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));
}
}
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
<?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;
}
// ...
}
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
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...
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
je me trompe peut etre mais faut il pas mieux mettre
class DatabaseAuth implements SessionInterface
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 :/
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.
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