2016-06-08 20 views
2

Ich baue gerade meine erste Larven App.Middleware überschreibt andere Middleware in Laravel

Ich habe zwei Benutzertypen: buyers und sellers. Beide haben jedoch Zugriff auf die gleichen Routen, müssen jedoch mit verschiedenen Vorlagen und Daten versorgt werden. Zum Beispiel hätten beide Zugriff auf /home, aber sehen etwas völlig anderes.

Ich weiß, ich kann eine if-Anweisung innerhalb der Route verwenden, aber das wird unordentlich. Um dies zu beheben, habe ich zwei separate Middlewares mit zwei verschiedenen Routengruppen erstellt. Jede Middleware überprüft den Benutzer um Erlaubnis, und meldet sie aus, wenn sie es nicht haben, etwa so:

 if (Auth::user()->role !== 'buyer') { 
      return redirect('login'); 
     } 

Mein Ziel:

  • Wenn der Benutzer ‚isBuyer‘, heißt es nur, dass Middleware-Routengruppe.
  • Wenn der Benutzer 'isSeller', liest es nur diese Middleware-Gruppe.

Ich hatte gehofft, beide im Tandem zu verwenden:

// this will be triggered if they have the role 'buyer' 
    Route::group(['middleware' => 'isBuyer'], function() { 
     Route::get('/', function () { 
      return view('/home-seller'); 
     }); 
    }); 

//this will be triggered if they have the role 'seller' 

     Route::group(['middleware' => 'isSeller'], function() { 
     Route::get('/', function () { 
      return view('/home-buyer'); 
     }); 
    }); 

Aber es liest nie die zweite Gruppe. Es protokolliert mich als Ergebnis der Auth-Test auf die erste Gruppe fehlgeschlagen.

Ich nehme an, dies liegt daran, dass es den Middleware-Filter anwendet, bevor er die Datei "routes.php" gelesen hat. Was ist am besten, wenn Sie dieselben Routen für verschiedene Benutzertypen verwenden?

Antwort

1

Sie so etwas wie diese verwenden: -

$middleware = ''; 
    if (Auth::user()->role == 'buyer') { 
       $middleware = 'isBuyer'; 
      } 
    elseif(Auth::user()->role == 'seller') { 
      $middleware = 'isSeller'; 
    } 
else{ 
    return redirect('login'); 
} 

    Route::group(['middleware' => $middleware], function() { 
      Route::get('/', function () { 
       return view('/home-seller'); 
      }); 
     }); 
1

Wie wäre es mit einer einzigen Route und Rendern von der Steuerung (Rücksendung einer Ansicht) abhängig von der Rolle mit "if Blöcke" für jede Rolle. Kannst du es versuchen?

1

Für diese Anforderung sollten Sie die Benutzerrolle in Ihrem App Controller/übergeordneten Controller überprüfen und den Benutzer abhängig von dieser Rolle zu ihren jeweiligen Aktionen umleiten.

Verwandte Themen