2013-08-23 4 views
15

Quindi sono nuovo del framework Laravel a partire dalla v4 e mi chiedo quale sia il modo di creare e utilizzare i controller RESTful. Leggendo la documentazione, sono un po 'confuso sulla differenza tra controller RESTful e controller di risorse.Laravel 4 che definisce i controller RESTful

Quando si definisce un controller RESTful, secondo la documentazione, esso suggerisce di fare quanto segue routes.php:

Route::controller('posts', 'PostController'); 

Nel PostController, definiamo i metodi della classe anteponendo il nome del metodo con l'HTTP verbo che dovremmo usare? Per esempio:

class PostController extends \BaseController { 
    public function getIndex() 
    { 
     // 
    } 
} 

Tuttavia, si delinea anche un modo di creare controller di risorse nel file routes.php in questo modo: Itinerario :: risorsa ('Post', 'PostController');

E in PostController.php definiamo i metodi senza prefissarlo con il verbo HTTP.

class PostController extends \BaseController { 
    public function index() 
    { 
     // 
    } 
} 

Qual è la differenza tra i due? E quando ne usiamo uno invece dell'altro, e perché?

Inoltre, si dovrebbe utilizzare Route::controller('posts', 'PostController'); o Route::resource('posts', 'PostController'); passare instradamento al controllore o dovremmo definire ciascuna rotta manualmente, come di seguito:

Route::get('/users', '[email protected]'); 
Route::get('/users/create', '[email protected]'); 
Route::post('/users', '[email protected]'); 
Route::get('/users/{id}', '[email protected]'); 
Route::get('/users{id}/edit', '[email protected]'); 
Route::put('/users', '[email protected]'); 
Route::delete('/users', '[email protected]'); 
+0

Quest'ultimo, Route :: risorsa, come da documentazione, a meno che non sia necessario un maggiore controllo. :) –

+0

Quindi usare 'Route :: controller ('posts', 'PostController');' non dovrebbe essere usato per creare controller RESTful? Né dovremmo prefissare i metodi del controller con il verbo HTTP appropriato? Mi rendo conto che l'ultima domanda probabilmente non è appropriata per questo formato poiché è soggettiva. – Iain

risposta

34

Prendere questo controllore come esempio:

<?php 

class TestController extends BaseController { 

    public function getIndex() 
    { 
     echo "a"; 
    } 

    public function postSecond($a) 
    { 
     echo "b"; 
    } 

} 

In i tuoi percorsi, se hai

Route::controller('tests', 'TestController'); 

E in esecuzione e

php artisan routes 

Avrai:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| Domain | URI          | Name     | Action       | Before Filters | After Filters | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
|  | GET /tests/index/{v1}/{v2}/{v3}/{v4}/{v5} |      | [email protected]   |    |    | 
|  | GET /tests         |      | [email protected]   |    |    | 
|  | POST /tests        | tests.store   | [email protected]    |    |    | 
|  | GET /tests/{_missing}      |      | [email protected]  |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

laravel ispeziona il controller e genera percorsi sulla base di quali sono i metodi che trova, automaticamente.

Ma se lo fai

Route::resource('tests', 'TestController'); 

Otterrete questa offerta percorso:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| Domain | URI          | Name     | Action       | Before Filters | After Filters | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
|  | GET /tests         |      | Closure       |    |    | 
|  | GET /tests         | tests.index   | [email protected]    |    |    | 
|  | GET /tests/create       | tests.create   | [email protected]    |    |    | 
|  | POST /tests        | tests.store   | [email protected]    |    |    | 
|  | GET /tests/{tests}       | tests.show    | [email protected]    |    |    | 
|  | GET /tests/{tests}/edit     | tests.edit    | [email protected]    |    |    | 
|  | PUT /tests/{tests}       | tests.update   | [email protected]    |    |    | 
|  | PATCH /tests/{tests}      |      | [email protected]    |    |    | 
|  | DELETE /tests/{tests}      | tests.destroy   | [email protected]   |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

No indovinare, laravel utilizza un elenco predefinito di CRUD percorsi, è possibile rimuovere alcuni di questi percorsi, ma non ispezionerà il tuo controller per creare percorsi per i tuoi metodi.

Sei tu a decidere cosa è meglio per te. Ma, in genere, se il controller è CRUD, Route :: resource() è un buon inizio, altrimenti è possibile utilizzare Route :: controller() o creare manualmente i percorsi.

EDIT:

ci nessun vero motivo per cui uno o l'altro perché, è solo una questione di design e scelta. Alcuni non useranno mai nessuno di loro. È solo il cappello Route::resource() segue il percorso di Rails di routing: http://guides.rubyonrails.org/routing.html.

Utilizzando Route::resource() non è necessario creare tutti quei metodi, ma vi ritroverete con un elenco di percorsi inutili, perché laravel creare sempre tutti loro per impostazione predefinita, a meno che non si fa:

Route::resource('photo', 'PhotoController', 
       array('only' => array('index', 'show'))); 

E il tuo elenco di percorsi mostrerà solo l'indice e mostrerà le azioni.

Inoltre, se hai bisogno di altri percorsi, utilizzando Route::resource() dovrai costruirli manualmente o utilizzare un po 'di magia per renderli automatici per tutti i tuoi percorsi pieni di risorse. Usando Route::controller() tutto è automatico, ogni volta che aggiungi un nuovo metodo, viene creato un nuovo percorso per te.

Anche in questo caso, se si dispone di un controller CRUD per la creazione, iniziare utilizzando Route::resource(). Altrimenti, pensa ai benefici dell'uno o dell'altro nel tuo caso particolare.

EDIT2:

Questo è un grande articolo, da Phil Sturgeon (PyroCMS e PHP-figura), sui vantaggi di costruire manualmente tutti i percorsi: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil.

+0

Non sono sicuro di capire la tua risposta. Perché dovrei usare 'Route :: controller' invece di' Route :: resource' se entrambi ottengono lo stesso risultato? 'Route :: controller' sembra un processo più complicato per configurare un controller RESTful in quanto richiede la rottura della convenzione e il prefisso dei metodi del controller con il verbo HTTP. C'è qualche ragione per usarlo su 'Route :: resource'? Se utilizzo 'Route :: resource', non è necessario disporre di metodi di controllo per l'indice, creare, archiviare, mostrare, modificare, aggiornare e distruggere, vero? L'aggiunta o la rimozione di metodi a questo rifletteranno nei percorsi disponibili? – Iain

+0

Modificato per chiarire. –

+3

Un'altra modifica, solo per aggiungere un collegamento a un articolo. –

5

@ La risposta di Antonio è buona. Lasciatemi dire qualcosa di simile e importante un po 'più conciso. In routes.php:

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

Utilizzando il metodo delle risorse rende laravel assumere funzionalità CRUD e sembra solo per i suoi sei, pre-fatti metodi CRUD: indice, creare, memorizzare, spettacolo, distruggere, ecc Ha vinto' t "vedi" qualsiasi altro nuovo metodo che crei lì.

Route::controller('info', 'InfoController'); 

L'utilizzo del metodo del controller consente di creare metodi/pagine personalizzati. Laravel li cerca quando anteponi il metodo/nome della pagina con un verbo HTTP. Nel tuo XxxxController.php:

class InfoController extends \BaseController { 

    public function getFeatures() 
    { 
     return View::make('info.features'); 
    } 

    public function getContactUs() 
    { 
     return View::make('info.contact-us'); 
    } 

    public function getPricing() 
    { 
     return View::make('info.pricing'); 
    } 

} 
+0

Molto chiaro in meno parole – Yash