Gibt es eine einfache Möglichkeit, das routengebundene Modell innerhalb einer Anfrage abzurufen?
Ich möchte ein Modell aktualisieren, aber bevor ich das tue, möchte ich einige Berechtigungsprüfungen mithilfe der Requests durchführen authorize() Methode. Aber ich möchte nur, dass der Besitzer des Modells es aktualisieren kann.
Im Controller würde ich einfach so etwas machen:
public function update(Request $request, Booking $booking)
{
if($booking->owner->user_id === Auth::user()->user_id)
{
// Continue to update
}
}
Aber ich möchte dies innerhalb der Anforderung und nicht innerhalb des Controllers tun. Wenn ich mache:
dd(Illuminate\Http\Request::all());
Es gibt mir nur die skalaren Formeigenschaften (wie z _method usw., aber nicht das Modell).
Frage
Wenn ich ein Modell an eine Route binde, wie kann ich dieses Modell aus einer Anfrage abrufen?
Vielen Dank im Voraus.
Als Update zu dieser Frage: Vielleicht möchten Sie sich Laravels ansehen Genehmigung Komponente. Scheint perfekt für deine Bedürfnisse!
– Martin Bean
7. November 2015 um 11:52 Uhr
Martin Bean
Unbedingt! Es ist ein Ansatz, den ich sogar selbst verwende.
Sie können die aktuelle Route in der Anfrage abrufen und dann alle Parameter wie folgt:
class UpdateRequest extends Request
{
public function authorize()
{
// Get bound Booking model from route
$booking = $this->route('booking');
// Check owner is the currently authenticated user
return $booking->owner->is($this->user());
}
}
Im Gegensatz zur (jetzt gelöschten) Antwort von Smartman führt dies nicht zu einer weiteren Find-Abfrage, wenn Sie das Modell bereits über die Route-Model-Bindung abgerufen haben.
Allerdings würde ich persönlich auch a verwenden Politik hier, anstatt Berechtigungsprüfungen in Formularanfragen einzufügen.
Danke für die Antwort! Ich wusste, dass es wahrscheinlich so etwas Einfaches sein würde, aber ich konnte es nicht selbst herausfinden! Ich akzeptiere wenn es mir erlaubt 🙂
– Phil Kreuz
21. April 2015 um 14:35 Uhr
Wow, wusste nichts von dieser Laravel-Funktion! Jeden Tag etwas Neues lernen! 🙂
– Limon Monte
21. April 2015 um 14:41 Uhr
Wenn ich den Routenparameter richtig verstanden habe, versteht Laravel automatisch, an welche Instanz dieser Parameter gebunden ist?
– Harry Geo
21. April 2015 um 14:47 Uhr
@akad0 Wenn Sie eine Route wie folgt definiert haben: Route::get('bookings/{booking}');dann Abrufen der booking Parameter würde den Wert dessen ergeben, was an gebunden ist {booking} Zeichen.
– Martin Bean
21. April 2015 um 14:49 Uhr
@MartinBean Nur der Wert oder die ganze Instanz? Betrachten Sie Ihren Code, den Sie verwenden $booking als Instanz und Zugriff auf die zugehörige Funktion owner() um die abzurufen user_id Attribut. EDIT: Oder übergeben Sie nur die Instanz als Wert?
class UpdateRequest extends Request
{
public function authorize()
{
return $this->booking->owner->user_id == $this->booking->user()->id;
}
}
Noch sauberer!
Um die Antwort von Martin Bean zu ergänzen, können Sie mit just auf die gebundene Instanz zugreifen route($param):
class UpdateRequest extends Request
{
public function authorize()
{
$booking = $this->route('booking');
return $booking->owner->user_id == $this->user()->id;
}
}
Notiz: Dies funktioniert in Laravel 5.1. Bei älteren Versionen habe ich das nicht getestet.
Wenn Sie die nicht verwenden bindings Middleware oder wenn Sie auf die gebundene zugreifen möchten $model irgendwo anders außer FormRequest und Controller Sie können Folgendes verwenden:
Als Update zu dieser Frage: Vielleicht möchten Sie sich Laravels ansehen Genehmigung Komponente. Scheint perfekt für deine Bedürfnisse!
– Martin Bean
7. November 2015 um 11:52 Uhr