2017-01-05 4 views
2

ich implizites Modell bin mit in Laravel 5.3.26 für Strecken wie dieseLaravel implizites Modell Bindung auslassen Parameter

Bindung

POST /teams/{team}/customers/{customer}/addresses

Die {team} in einer Middleware verwendet, um zu bestimmen, welche Mannschaft die Benutzer derzeit verwendet . Die Speichermethode für die Adressen benötigt jedoch nur die {customer} injiziert; Es greift auf das Team in keiner Weise zu. So ist der Header des Verfahrens könnte wie folgt aussehen:

public function store(Customer $customer, Request $request) 

Leider ist die ID des ausgewählten Teams wird injiziert in $customer anstelle der tatsächlichen Customer Instanz. Wenn ich den $team Parameter in den Laden Methode hinzufügen, so würde die Funktion Header wie folgt aussehen:

public function store(Team $team, Customer $customer, Request $request) 

alles wie erwartet funktioniert. Gibt es eine Möglichkeit, den $team Parameter wegzulassen, aber immer noch die korrekte Customer Instanz in die Funktion injiziert?

+0

Wie wäre es mit '/ Kunden/{Kunde}/Adressen? Team = 2'? Denn es sieht so aus, als ob Sie versuchen, die Adresse des Kunden bei einer bestimmten ID zu erhalten, und Team-Informationen sehen aus wie zusätzliche Daten. –

Antwort

0

Ich denke, man sollte nur einen anderen Weg für diese machen:

Route::put('customers', '[email protected]')-name('customers.store'); 

Dann Formular:

<form action="{{ route('customers.store') }}' method="POST"> 
    {{ method_field('PUT') }} 
    {{ csrf_field() }} 
    //other stuff 
</form> 

Alternativ kann, wenn es sein muss, können Sie nur eine ? in der Route verwenden, um diktieren, dass das Modell kann oder nicht vorhanden sein:

Route::post('/teams/{team?}/customers/{customer}/addresses', '[email protected]'); 

Dann in Ihrem contr olle Methode, würden Sie noch $team definieren müssen, aber es kann oder auch nicht existieren, wie zum Beispiel:

public function store(Request $request, $team = null, Customer $customer) 

Side HinweisRequest sollte immer zuerst kommen.

+0

Danke für Ihre Antwort. Ich habe das vielleicht nicht klar genug dargestellt: Der Teamroute-Parameter ist obligatorisch. Ich brauche es einfach nicht in meinem Controller, aber es wird woanders verwendet. Das ist der Grund, warum ich den Parameter '$ team' aus der Speichermethode meines Controllers weglassen möchte, weil ich ihn dort nie verwenden werde und es irgendwie merkwürdig erscheint, einen Parameter zu injizieren, wenn Sie ihn nicht benutzen. – Tobias

+0

@Tobias Ah! Danke für die Abklärung. Angesichts des Designs Ihres Systems würde ich Ihnen empfehlen, dafür zu sorgen, dass es da ist. Dies ist ein Designmuster, und auf keinen Fall fühle ich, dass es falsch ist. – Ohgodwhy