2014-06-24 2 views
5

Ho utilizzato RESTful controllers nel mio progetto Laravel. Includendo:È possibile eseguire il routing del modello da utilizzare con i controller RESTful?

Route::controller('things', 'ThingController') 

nel mio routes.php, posso definire funzioni nel ThingController come:

public function getDisplay($id) { 
    $thing = Thing::find($id) 
    ... 
} 

in modo che ottenere l'URL" ... le cose/display/1" sarebbe automaticamente diretto alla funzione del controller. Questo sembra abbastanza utile e ha funzionato benissimo per me finora.

Ho notato che molte delle funzioni del mio controller iniziano con l'ottenimento di un modello tramite ID dall'URL, e ho pensato che sarebbe stato bello poter usare route model binding per farlo invece per me. Così ho aggiornato il mio routes.php a

Route::model('thing', 'Thing'); 
Route::controller('things', 'ThingController') 

e cambiato i ThingController funzioni per

public function getDisplay($thing) { 
    ... 
} 

ho assunto questo sarebbe magicamente lavorare nel modo volevo che (come tutto il resto che ho provato finora in Laravel ha), ma sfortunatamente ottengo "Tentativo di ottenere la proprietà di non oggetto" quando tento di utilizzare $thing nella funzione. È qualcosa che dovrebbe essere in grado di funzionare e ho appena fatto qualcosa di sbagliato, o posso dire che il binding del modello funziona solo con percorsi esplicitamente denominati in routes.php?

risposta

4

Se non ti dispiace, con percorso URI, nome del metodo e solo di lavoro metodo solo show, edit e update, è possibile utilizzare per generare Resource Controller stringa URI che può definire il modello vincolante.

In routes.php modifica

Route::model('things', 'Thing'); 
Route::resource('things', 'ThingController'); 

È possibile utilizzare php artisan routes comando per vedere tutti gli URI

$ artisan routes | grep ThingController 
GET|HEAD things    | things.index    | [email protected] 
GET|HEAD things/create   | things.create    | [email protected] 
POST things     | things.store    | [email protected] 
GET|HEAD things/{things}  | things.show    | [email protected] 
GET|HEAD things/{things}/edit | things.edit    | [email protected] 
PUT things/{things}   | things.update    | [email protected] 
PATCH things/{things}   |       | [email protected] 

Dopo di che è possibile parametro di minaccia come Thing oggetto senza nome in modo esplicito percorso.

/** 
* Display the specified thing. 
* 
* @param Thing $thing 
* @return mixed 
*/ 
public function show(Thing $thing) 
{ 
    return $thing->toJson(); 
} 

Se si desidera accedere [email protected], passare l'ID del modello e laravel recupererà automaticamente.

http://example.com/things/1

{"id":1,"type":"Yo!"} 
1

È possibile utilizzare Percorso: risorse e ancora fornire altri metodi. Posiziona il percorso necessario poco prima di quella particolare linea Route::resource. Ad esempio:

Route::model('things', 'Thing'); 
Route::get('things/{things}/owner', '[email protected]'); 
Route::resource('things', 'ThingController'); 

quindi creare il corrispondente metodo nel controller.

public function getOwner($things) { 
    return Response::json($things->owner()->get()); 
} 

Questa è la documentazione ufficiale di Laravel 4.2 docs:

Fonte: http://laravel.com/docs/controllers#resource-controllers

Aggiunta di altre rotte a risorsa Controller

Se si rende necessario per aggiungere altre rotte a un controller di risorse al di là dei percorsi di risorse di default, è necessario definire i percorsi prima la vostra chiamata a Route::resource:

Route::get('photos/popular'); 
Route::resource('photos', 'PhotoController');