2016-08-06 15 views
0

Ich versuche, einen Abschnitt "Profileinstellungen" in einer Anwendung zu machen. Die Sache ist, ich habe gelernt, wie man das "Admin" Weg, die Route wäre /users/{user}/edit, würde die Edit-Methode auf dem Controller aufrufen und es würde die Bearbeitungsansicht zurückgeben. Dort würde ich ein Formular haben, das der Benutzer auf die Route users/{user} patchen würde, und es würde die Update-Methode auf dem Controller aufrufen.Passieren Sie den aktuellen Benutzer in Laravel zu routen?

Aber ich möchte nicht, dass jemand andere Benutzer bearbeitet, also würde ich gerne wissen, ob es eine Möglichkeit gibt, diese Route auf den aktuellen Benutzer zu beschränken.

Vielen Dank im Voraus.

Antwort

1

Seit Version 5.1 hat Laravel Richtlinien, die genau das sind, was Sie brauchen.

Sie können eingeben, indem Sie Befehl, um eine neue Richtlinie erstellen:

php artisan make:policy UserPolicy 

In Ihrem UserPolicy Klasse können Sie das folgende Verfahren umfassen:

public function updateProfile(User $user, User $updatedUser) { 
    return $user->id === $updatedUser->id; 
} 

Bitte beachten Sie: Der erste Parameter user $ wird automatisch hinter den Kulissen aufgelöst und ist der aktuell angemeldete Benutzer. Wenn Sie die Richtlinie über die Gate-Fassade in Ihrer Anwendung überprüfen, müssen Sie nur den zweiten Parameter $ updateUser übergeben.

Dann müssen Sie Ihre Politik im AuthServiceProvider registrieren:

use Acme\User; 
use Acme\Policies\UserPolicy; 
... 

class AuthServiceProvider extends ServiceProvider { 

protected $policies = [ 
    User::class => UserPolicy::class 
] 

Nun, wenn Sie Ihre Politik registriert Sie es über Ihre App überprüfen können die Gate-Fassade mit etwa so:

if(Gate::allows('updateProfile', $user)) { 
    // Your logic goes here 
} 

Oder der andere Ansatz mit Ich mag mehr mit der Ablehnungs-Methode und enthalten es am Anfang meiner Controller-Methoden und HTTP-Fehler zurück:

public function edit($id) { 
    if(Gate::denies('updateProfile', $user)) { 
     abort(403, 'You do not have permissions to access this page!'); 
    } 

    // The check is passed and your can include your logic 
} 

Sie können auch für Berechtigungen in den Blade-Dateien überprüfen können mit und möchte nicht so:

@can('updateProfile', $user) 
// Show something only to the user that can edit the $user's profile 
@endcan 

Für weitere Informationen die docs überprüfen.

0

Sie sollten die Benutzer-ID nicht eingeben müssen, da der Benutzer bereits angemeldet ist und sich dort selbst bearbeiten darf, sodass nur der angemeldete Benutzer ausgewählt wird.

So können Sie die Routen verwenden /user/edit und /user/update etc

erhalten Sie die aktuellen Benutzerdaten wie

Auth::user()->id 

oder etwas anderes wie

$user = Auth::user(); 

So wird nur der angemeldete Benutzer (selbst) kann bearbeitet werden.

0

In der Ansicht sollte es eine Schaltfläche oder einen Link sein, beim Klicken die ID an die gewünschte Route übergeben, das ist es.

Beispiel:

für den aktuellen Benutzer ID angemeldet Grabbing sollten Sie tun, wie

$user = Auth::user()->id; 

Und direkt in der Route können Sie es wie

<a href="{{ url('route', Auth::user()->id; }}">Edit</a> 

Jetzt bekommen, wenn jemand Klicks Auf der Bearbeiten-Schaltfläche/Link wird die Route wie route/currentuserid aussehen.

+0

Aber was hindert Benutzer daran, die URL mit einer anderen ID direkt einzugeben? –

+0

Sie können überprüfen, dass in Ihrem Controller, wenn die $ ID, die übergeben wird, nicht in Ihrer Datenbank vorhanden ist, dann einen Fehler oder eine Nachricht zu werfen. –