2017-09-25 16 views
1

Ich bin ein Tutorial auf Laravel Gates, wo Benutzer mit der Berechtigung 'Update-Post' dürfen jeden Beitrag in der Datenbank bearbeiten. Darüber hinaus kann jeder Benutzer unabhängig von Berechtigungen die von ihm gesendeten Beiträge bearbeiten.Laravel Benutzer Erlaubnis, eigenen Beitrag zu aktualisieren

app/Anbieter/AuthServiceProvider.php:

Gate::define('update-post', function ($user, \App\Post $post) { 
    return $user->hasAccess(['update-post']) or $user->id == $post->user_id; 
}); 

Routen/web.php:

Route::get('/edit/{post}', '[email protected]') 
    ->name('edit_post') 
    ->middleware('can:update-post,post'); 

Route::post('/edit/{post}', '[email protected]') 
    ->name('update_post') 
    ->middleware('can:update-post,post'); 

Was ich suche ist eine Möglichkeit, eine neue Berechtigung hinzuzufügen, sagen ‚update -own-post ', wo nur Benutzer mit dieser Berechtigung ihre eigenen Beiträge bearbeiten dürfen.

So hätte ein Moderator zum Beispiel die Berechtigung 'update-post', mit der er alle Beiträge bearbeiten kann. Ein regulärer Benutzer kann seinen eigenen Post nur bearbeiten, wenn er die neue Berechtigung 'update-own-post' erhält, aber nicht jeden Benutzer, wie er gerade implementiert ist.

Was ist der beste Weg, diese Änderung in meinem Code zu implementieren?

Antwort

0

Im Tor möchten Sie die Art der Benutzer überprüfen, so sollten sie, wenn eine der folgenden bearbeiten können zutreffen:

  1. $user->hasAccess(['update-post'])
  2. $user->id == $post->user_id
  3. $user->isModerator()

Ich weiß nicht, wie Sie Ihre Benutzertypen eingerichtet haben, aber ich würde empfehlen, eine Methode zu Ihrem Benutzermodell hinzufügen, die den Typ des Benutzers überprüft, und wenn der Typ e des Benutzers ist "Moderator" oder welcher Name auch immer Sie gewählt haben, sollte es wahr zurückgeben.

Sie würden ähnlich wie mit etwas gelassen werden:

Gate::define('update-post', function ($user, \App\Post $post) { 
    return $user->hasAccess(['update-post']) || $user->id == $post->user_id || $user->isModerator(); 
}); 

Bearbeiten - von Kommentaren

Basierend auf Ihren Kommentar antworten Sie es wie so erreichen kann, ist hier die gereinigt Code:

Gate::define('update-post', function ($user, \App\Post $post) { 
    return ($user->id == $post->user_id && $user->hasAccess(['update-own-post'])) || $user->hasAccess(['update-post']); 
}); 

Der Grund, dass dies funktioniert, ist, weil Ihre Überprüfung, ob {first condition} OR {second condition} die Kriterien erfüllt. Wenn der erste Block wahr ist, wird der zweite Block nicht einmal ausgeführt; Wenn der erste Block jedoch nicht wahr ist, prüft er die Sekunde, um zu sehen, ob sie wahr ist.

+0

Danke, dass Sie mich in die richtige Richtung weisen. Ich konnte erreichen, was ich brauche, indem ich das Tor zu folgendem ändere: 'Gate :: define ('update-post', Funktion ($ user, \ App \ Post $ post) { if (($ user-> id == $ post-> user_id) && ($ user-> hasAccess (['update-own-post']))) return true; sonst if ($ user-> hasAccess (['update-post'])) return true; }); 'Würde aber einen saubereren Code schätzen. –

+0

Ich bin froh, dass Sie es geschafft haben, überprüfen Sie meinen Code für eine sauberere Version von dem, was Sie haben. Außerdem empfehle ich, in PHP nach PHP zu suchen ("' || ''), damit Sie einige der zusätzlichen Bedingungsprüfungen loswerden können. http://php.net/manual/en/language.operators.logical.php – kyle

Verwandte Themen