2016-04-09 14 views
6

Ich möchte überprüfen, ob ein Benutzer angemeldet ist. Dafür habe ich eine Klasse, die wahr oder falsch zurückgibt. Jetzt möchte ich eine Middleware, die prüft, ob der Benutzer angemeldet ist.Slim 3 Middleware Redirect

$app->get('/login', '\Controller\AccountController:loginGet')->add(Auth::class)->setName('login'); 
$app->post('/login', '\Controller\AccountController:loginPost')->add(Auth::class); 

Auth Klasse

class Auth { 
    protected $ci; 
    private $account; 

    //Constructor 
    public function __construct(ContainerInterface $ci) { 
     $this->ci = $ci; 
     $this->account = new \Account($this->ci); 
    } 

    public function __invoke($request, \Slim\Http\Response $response, $next) { 
     if($this->account->login_check()) { 
      $response = $next($request, $response); 
      return $response; 
     } else { 
      //Redirect to Homepage 
     } 

    } 
} 

So, wenn der Benutzer auf der Seite angemeldet ist, wird korrekt dargestellt. Aber wenn der Benutzer nicht autorisiert ist, möchte ich auf die Homepage umleiten. Aber wie?!

$response->withRedirect($router->pathFor('home'); 

Dies funktioniert nicht!

Antwort

9

Sie müssen return die Antwort. Vergessen Sie nicht, dass die Objekte request und response unveränderlich sind.

return $response = $response->withRedirect(...); 

Ich habe eine ähnliche Auth Middleware und das ist, wie ich es tun, die auch eine 403 (unberechtigten) Header hinzufügt.

$uri = $request->getUri()->withPath($this->router->pathFor('home')); 
return $response = $response->withRedirect($uri, 403); 
+1

Diese Lösung funktioniert nicht – Vashtamyty

+0

Von innerhalb Middleware nutzen kann, das nicht funktioniert. – systemovich

+0

In OPs Fall haben sie vor der Verwendung keine Variable '$ router' definiert. Wo definierst du '$ this-> router' unter der Annahme, dass deine Middleware nicht von einer anderen Klasse erbt? –

-2

Verwendung:

http_response_code(303); 
header('Location: ' . $url); 
exit; 
+1

Bitte versuchen Sie, Ihre Antwort zu erklären, anstatt nur Code zu schreiben. –

+0

@NahuelIanni, es ist selbsterklärend, wenn Sie PHP kennen. – systemovich

+2

Während ich sicher bin, dass das wahrscheinlich funktioniert, suchte OP wahrscheinlich nach einer Lösung, die die Funktionalität des Slim Framework anstelle von einfachem PHP verwendete. –

1

Gebäude aus Antwort von tflight ist, müssen Sie die folgenden Funktionen alles funktioniert wie beabsichtigt zu tun. Ich habe versucht, dies als Revision einzureichen, da der in der Antwort von tflight bereitgestellte Code auf dem Framework nicht ohne weiteres funktioniert, aber abgelehnt wurde, also in einer separaten Antwort:

Sie benötigen Folgendes Zusätzlich zu Ihrer Middleware:

protected $router; 

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

Zusätzlich wird, wenn die Middleware deklariert, müssen Sie den folgenden den Konstruktor hinzuzufügen:

$app->getContainer()->get('router') 

Etwas ähnliches wie:

$app->add(new YourMiddleware($app->getContainer()->get('router'))); 

Ohne diese Änderungen funktioniert die Lösung nicht und es wird ein Fehler angezeigt, dass $ this-> router nicht existiert.

Mit diesen Änderungen an Ort und Stelle können Sie dann den Code von tflight

$uri = $request->getUri()->withPath($this->router->pathFor('home')); 
return $response = $response->withRedirect($uri, 403); 
Verwandte Themen