2015-04-21 11 views
20

Esiste un modo semplice per recuperare il modello associato al percorso all'interno di una richiesta?Laravel recupera il modello associato in Richiesta

Desidero aggiornare un modello, ma prima di farlo, desidero eseguire alcuni controlli delle autorizzazioni utilizzando il metodo Richieste authorize(). Ma voglio solo che il proprietario del modello sia in grado di aggiornarlo.

Nel controllore, vorrei semplicemente fare qualcosa di simile:

public function update(Request $request, Booking $booking) 
{ 
    if($booking->owner->user_id === Auth::user()->user_id) 
    { 
     // Continue to update 
    } 
} 

ma sto cercando di fare questo all'interno della richiesta, piuttosto che all'interno del controller. Se faccio:

dd(Illuminate\Http\Request::all()); 

Mi dà solo le proprietà di forma scalare (come ad esempio _method e così via, ma non il modello).

Domanda

Se mi legano un modello da un percorso, come posso recuperare quel modello dall'interno di una richiesta?

Molte grazie in anticipo.

+1

Come aggiornamento a questa domanda: è possibile controllare il componente [autorizzazione] (http://laravel.com/docs/master/authorization) di Laravel. Sembra perfetto per le tue esigenze! –

risposta

36

Assolutamente! È un approccio che uso anche io stesso.

È possibile ottenere il percorso corrente nella richiesta, e poi tutti i parametri, in questo modo:

class UpdateRequest extends Request 
{ 
    public function authorize() 
    { 
     $booking = $this->route('booking'); 

     return $booking->owner->user_id == $this->user()->id; 
    } 
} 

differenza smartman 's (ora cancellato) risposta, questo non incorrere in un'altra query trovare se si dispone di ha già recuperato il modello tramite associazione modello di percorso.

+1

Grazie per la risposta! Sapevo che probabilmente sarebbe stato qualcosa di così semplice, ma non potevo risolverlo da solo! Accetterò quando mi permette di :) –

+1

wow, non sapevo di questa funzionalità di Laravel! Impara qualcosa di nuovo ogni giorno! :) –

+0

Se ho capito correttamente il parametro di percorso laravel capisce automaticamente a quale istanza viene associato questo parametro? –

2

di aggiungere alla risposta Martin Bean s', è possibile accedere all'istanza rilegato utilizzando solo route($param):

 
class UpdateRequest extends Request 
{ 
    public function authorize() 
    { 
     $booking = $this->route('booking'); 

     return $booking->owner->user_id == $this->user()->id; 
    } 
} 

Nota: Questo funziona in laravel 5.1. Non ho provato questo su versioni precedenti.

0

Una volta eseguito il binding esplicito (https://laravel.com/docs/5.5/routing#route-model-binding), è possibile ottenere direttamente il modello con $ this.

class UpdateRequest extends Request 
{ 
    public function authorize() 
    { 
     return $this->booking->owner->user_id == $this->booking->user()->id; 
    } 
} 

Ancora più pulito!

Problemi correlati