Laravel: Gebundenes Modell aus Anfrage abrufen

Lesezeit: 3 Minuten

Benutzeravatar von Phil Cross
Phil Kreuz

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


Benutzeravatar von Martin Bean
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?

    – Harry Geo

    21. April 2015 um 14:52 Uhr


Nachdem Sie Ihre explizite Bindung vorgenommen haben (https://laravel.com/docs/5.5/routing#route-model-binding) können Sie Ihr Modell tatsächlich direkt mit $this erhalten.

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:

$book = app(Book::class)->resolveRouteBinding(request()->route('book'));

1434210cookie-checkLaravel: Gebundenes Modell aus Anfrage abrufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy