Bonjour,

Voila je rencontre une problèmatique avec mon code utilisant slim 3.

Ce que je veux faire

Je souhaite créer un middleware pour gérer la présence de la variable $_SESSION['auth'], si elle existe pas je souhaite rediriger sur ma page login, la vérification fonctionne, mais pour la redirection je suis coincé, comment je peux dire à slim de rediriger sur une page (route) dans mon middleware ?

2 réponses


SimonDevelop
Auteur
Réponse acceptée

Salut, j'ai déjà regarder la vidéo de grafikart, j'ai même fait mon propre template slim...

Ta solution n'est pas bonne, car mon container ne possède en aucun cas l'objet auth, j'avais déjà regarder sur internet des solutions de ce genre et au final j'ai trouvé via ce tuto youtube avec quelques modifs:
https://www.youtube.com/watch?v=ZLmCdbNYHAo

Mon middleware:

<?php
namespace App\Middlewares;

use Slim\Http\Request;
use Slim\Http\Response;

class SessionMiddleware {

  private $container;

  public function __construct($container) {
    $this->container = $container;
  }

  public function __invoke(Request $request, Response $response, $next) {
    if (!isset($_SESSION['auth']) || empty($_SESSION['auth'])) {
      return $response->withRedirect($this->container->router->pathFor('login'));
    }
    $response = $next($request, $response);
    return $response;
  }
}

Mes routes:

$app->group('', function () {

  // Route logout
  $this->get('/logout', LoginController::class. ':getLogout')->setName('logout');

  // Routes home
  $this->get('/', HomeController::class. ':getHome')->setName('home');
  $this->post('/', HomeController::class. ':postHome');

})->add(new App\Middlewares\SessionMiddleware($container));

Merci d'avoir quand même pris le temps pour essayer de m'aider :)

Le code est assé simple voici:

 public function __invoke(Request $request, Response $response, $next)
    {
        if(!$this->container->auth->check()){
            return $response->withStatus(200)->withHeader('Location', 'login');
        }

        $response = $next($request, $response);
        return $response;
    }

Explication :
je stock la variable $_SESSION['auth'] dans le container. Si celle-ci n'existe pas je renoi une reponse avec redirection "login" est le nom de ma route.

Je te conseille de regarder le tuto de grafikart sur slim 3 il est très bien fait et donne une bonne base pour pour créer un projet Slim, après à toi d'adapter à tes besoins.