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


A quoi ressemble ? DatabaseAuth

<?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