Laravel - Route :: risorse vs Route :: controller


138

Ho letto i documenti sul sito Web di Laravel, Stack Overflow e Google, ma ancora non capisco la differenza tra Route::resourcee Route::controller.

Una delle risposte diceva Route :: risorse era per il greggio. Tuttavia, con Route :: controller possiamo realizzare le stesse cose di Route :: resource e possiamo specificare solo le azioni necessarie.

Sembrano essere come fratelli:

Route::controller('post','PostController');
Route::resource('post','PostController');

Come possiamo scegliere cosa usare? Che cos'è la buona pratica?


12
Solo una nota per gli utenti di Laravel 5.2, nel frattempo i controller impliciti sono obsoleti.
Roy,

Risposte:


283

RESTful Controller risorse

Un controller di risorse RESTful imposta alcune route predefinite per te e addirittura le nomina.

Route::resource('users', 'UsersController');

Ti dà questi percorsi denominati:

Verb          Path                        Action  Route Name
GET           /users                      index   users.index
GET           /users/create               create  users.create
POST          /users                      store   users.store
GET           /users/{user}               show    users.show
GET           /users/{user}/edit          edit    users.edit
PUT|PATCH     /users/{user}               update  users.update
DELETE        /users/{user}               destroy users.destroy

E configureresti il ​​tuo controller in questo modo (azioni = metodi)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Puoi anche scegliere quali azioni sono incluse o escluse in questo modo:

Route::resource('users', 'UsersController', [
    'only' => ['index', 'show']
]);

Route::resource('monkeys', 'MonkeysController', [
    'except' => ['edit', 'create']
]);

Documentazione RESTful Resource Controller


Controller implicito

Un controller implicito è più flessibile. Si viene indirizzati ai metodi del controller in base al tipo e al nome della richiesta HTTP. Tuttavia, non hai nomi di percorsi definiti per te e catturerà tutte le sottocartelle per lo stesso percorso.

Route::controller('users', 'UserController');

Ti porterebbe a configurare il controller con una sorta di schema di denominazione RESTful:

class UserController extends BaseController {

    public function getIndex()
    {
        // GET request to index
    }

    public function getShow($id)
    {
        // get request to 'users/show/{id}'
    }

    public function postStore()
    {
        // POST request to 'users/store'
    }

}

Documentazione implicita del controller


È buona norma utilizzare ciò di cui hai bisogno, secondo le tue preferenze. Personalmente non mi piacciono i controller impliciti , perché possono essere disordinati, non fornire nomi e possono creare confusione durante l'utilizzo php artisan routes. In genere utilizzo i controller di risorse RESTful in combinazione con percorsi espliciti.


1
Se utilizziamo diversi percorsi di risorse (forse indicizza, mostra) perché non utilizzare percorsi statici Route :: get (...)? Penso che non sia meglio non peggio che usare array ('only' => array ('index', 'show'). E quale metodo utilizzato per il controller RESTFull quando richiediamo qualcosa come 'user / 123', getIndex () funziona per 'user /' ma con user / 123 ricevo l'errore NotFoundHttpException (ho provato nomi diversi getView e altri, funziona solo quando si dichiara come Controller @ getView)?
Sonique,

Qualcuno può chiarire a cosa serve 'resource.edit'? È un metodo GET, quindi presumo che si supponga che le informazioni complete su una risorsa siano complete, piuttosto che solo informazioni limitate tramite 'resource.show'?
Anthony,

1
@Anthony - resource.editè per mostrare una vista di modifica, in sostanza, il modulo per la modifica di una risorsa esistente.
Ryanwinchester,

@fungku È interessante .. quindi stai dicendo che resource.edit restituirebbe effettivamente HTML anziché JSON?
Anthony,

2
@Anthony In generale, (e per quanto ne so) sì. resource.edite resource.createsono in genere per un'interfaccia utente ... il rendering di una vista con moduli HTML. Quelle forme sarebbero PUT / POST a resource.updatee resource.storerispettivamente. Se non lo stai facendo, puoi semplicemente ignorarli e sbarazzarti dei metodi edit () e create () nel tuo controller.
Ryanwinchester,

3

Per il metodo del controller di rotta dobbiamo definire solo una rotta. Nel metodo get o post dobbiamo definire il percorso separatamente.

E il metodo delle risorse viene utilizzato per creare più percorsi per gestire una varietà di azioni Restful.

Qui la documentazione di Laravel su questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.