Laravel – Route::resource vs Route::controller (Programare, Laravel, Laravel 5, Laravel 4)

Sonique a intrebat.

Am citit documentația de pe site-ul Laravel, Stack Overflow și Google, dar tot nu înțeleg diferența dintre Route::resource și Route::controller.

Unul dintre răspunsuri spunea că Route::resource este pentru crud. Cu toate acestea, cu Route::controller putem realiza același lucru ca și cu Route::resource și putem specifica doar acțiunile necesare.

Se pare că sunt ca frați și surori:

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

Cum putem alege ce să folosim? Care este o bună practică?

Comentarii

  • Doar o notă pentru utilizatorii Laravel 5.2, între timp, controlorii impliciți sunt depreciați. –  > Por Roy.
2 răspunsuri
ryanwinchester

Controler de resurse RESTful

A Controler de resurse RESTful stabilește câteva rute implicite pentru dvs. și chiar le numește.

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

Vă oferă aceste rute denumite:

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

Iar tu îți vei configura controlerul în felul următor (acțiuni = metode)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

De asemenea, puteți alege ce acțiuni sunt incluse sau excluse astfel:

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

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

Controler de resurse API

Laravel 5.5 a adăugat o altă metodă pentru a trata rutele pentru controlorii de resurse. Controler de resurse API acționează exact ca cel arătat mai sus, dar nu înregistrează create și edit rutele. Acesta este menit să fie utilizat pentru a facilita cartografierea rutelor utilizate în API-urile RESTful – unde, de obicei, nu aveți niciun fel de date localizate în create și nici edit metode.

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

Documentația controlerului de resurse RESTful

Controler implicit

Un controler implicit este mai flexibil. Sunteți direcționat către metodele controlerului dumneavoastră pe baza tipului și a numelui solicitării HTTP. Cu toate acestea, nu aveți nume de rute definite pentru dvs. și va prinde toate subfolderele pentru aceeași rută.

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

Te-ar duce la configurarea controlerului cu un fel de schemă de denumire 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'
    }

}

Documentația Implicit Controller

Este o bună practică să folosiți ceea ce aveți nevoie, în funcție de preferințele dvs. Mie personal nu-mi place Implicit Controller, deoarece pot fi dezordonate, nu oferă nume și pot fi confuze atunci când se utilizează php artisan routes. De obicei, eu folosesc controlori de resurse RESTful în combinație cu rute explicite.

Comentarii

  • Dacă folosim mai multe rute de resurse (poate index, show), de ce să nu folosim rute statice Route::get(…)? Cred că nu este mai bine nici mai rău decât să folosim array(‘only’ => array(‘index’, ‘show’). Și ce metodă se folosește pentru controlerul RESTFull atunci când solicităm ceva de genul „user/123”, getIndex() funcționează pentru „user/”, dar cu user/123 primesc eroarea NotFoundHttpException (am încercat diferite nume getView și altele, funcționează doar atunci când este declarat ca [email protected])? –  > Por Sonique.
  • Poate cineva să clarifice pentru ce este destinat ‘resource.edit’? Este o metodă GET, așa că presupun că ar trebui să ofere informații complete despre o resursă, mai degrabă decât doar informații limitate prin „resource.show”? –  > Por Anthony.
  • @Anthony – resource.edit este de a afișa o vizualizare de editare, practic, formularul pentru editarea unei resurse existente. –  > Por ryanwinchester.
  • @fungku Este interesant… deci vreți să spuneți că resource.edit ar returna de fapt HTML în loc de JSON? –  > Por Anthony.
  • @Anthony În general, (și din câte știu eu) da. resource.edit și resource.create sunt de obicei pentru o interfață utilizator… redarea unei vizualizări cu formulare HTML. Aceste formulare ar fi PUT/POST către resource.update și resource.store respectiv. Dacă nu faceți acest lucru, atunci puteți să le ignorați și să scăpați de metodele edit() și create() din controlerul dumneavoastră. –  > Por ryanwinchester.
Ahmad Sharif

Pentru metoda route controller trebuie să definim doar o singură rută. În metoda get sau post trebuie să definim ruta separat.

Iar metoda resurse este utilizată pentru a crea mai multe rute pentru a gestiona o varietate de acțiuni Restful.

Aici, metoda Laravel documentation despre acest lucru.