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.
Quest'ultimo, Route :: risorsa, come da documentazione, a meno che non sia necessario un maggiore controllo. :) –
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