2013-08-23 13 views
15

Also ich bin neu im Laravel-Framework ab v4 und frage mich, wie man RESTful-Controller erstellen und verwenden kann. Wenn ich die Dokumentation durchlese, bin ich ein wenig verwirrt, was den Unterschied zwischen RESTful-Controllern und Resource-Controllern betrifft.Laravel 4 definiert RESTful-Controller

Wenn eine RESTful Controller definiert, wie pro die docs, es folgt die in routes.php schlägt tun:

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

Im PostController, tun wir die Klassenmethoden durch das Vorsetzen den Namen des Verfahrens mit dem HTTP definieren Verb möchten wir verwenden? Zum Beispiel:

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

jedoch umreißt auch eine Möglichkeit, Ressourcen-Controller in der routes.php Datei zu erstellen, wie so: Strecke :: Ressource (‚Beiträge‘, ‚Postcontroller‘);

Und in PostController.php definieren wir Methoden ohne Präfix mit dem HTTP-Verb.

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

Was ist der Unterschied zwischen den beiden? Und wann benutzen wir eines statt des anderen und warum?

Auch sollten wir verwenden Route::controller('posts', 'PostController'); oder Route::resource('posts', 'PostController'); Routing an die Steuerung zu übergeben oder sollten wir jede Route manuell definieren, wie unten:

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

Letzteres, Route :: Ressource, wie in der Dokumentation - es sei denn, Sie benötigen mehr Kontrolle. :) –

+0

Also mit 'Route :: Controller ('posts', 'PostController');' sollte nicht verwendet werden, um RESTful-Controller zu erstellen? Weder sollten wir den Controller-Methoden das entsprechende HTTP-Verb voranstellen? Mir ist klar, dass die letzte Frage für dieses Format wahrscheinlich nicht angemessen ist, da es subjektiv ist. – Iain

Antwort

34

Nehmen Sie diesen Regler als Beispiel:

<?php 

class TestController extends BaseController { 

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

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

} 

In Ihre Routen, wenn Sie haben

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

And execut

e
php artisan routes 

werden Sie haben:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| 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 prüft die Steuerung und erzeugt Routen basierend auf welche Methoden es findet, automatisch.

Aber wenn Sie

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

tun Sie finden diese Route-Eintrag erhalten:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| 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]   |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

Keine erraten, Laravel verwendet eine vordefinierte CRUD Liste von Routen, können Sie einige dieser Routen entfernen, aber Es wird Ihren Controller nicht untersuchen, um Routen für Ihre Methoden zu erstellen.

Sie entscheiden, was das Beste für Sie ist. Aber normalerweise ist Route :: resource() ein guter Anfang, wenn Sie einen CRUD-Controller verwenden, andernfalls können Sie Route :: controller() verwenden oder Ihre Routen manuell erstellen.

EDIT:

Es gibt keine wirklich, warum eine oder warum eine andere ist nur eine Frage der Gestaltung und Auswahl. Einige werden keines von ihnen jemals benutzen. Es ist nur Hut Route::resource() folgt dem Weg der Schiene Routing: http://guides.rubyonrails.org/routing.html.

Mit Route::resource() Sie brauchen nicht alle diese Methoden zu erstellen, aber Sie werden mit einer Liste von sinnlose Routen enden, weil Laravel immer alle von ihnen standardmäßig erstellen, es sei denn, Sie tun:

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

Und Ihre Routenliste zeigt nur den Index und zeigt Aktionen an.

Wenn du noch andere Routen benötigst, musst du sie mit Route::resource() manuell erstellen oder mit etwas Magie arbeiten, um sie für all deine findigen Routen automatisch zu machen. Mit Route::controller() ist alles automatisch, jedes Mal, wenn Sie eine neue Methode hinzufügen, wird eine neue Route für Sie erstellt.

Wenn Sie einen CRUD-Controller erstellen möchten, beginnen Sie mit Route::resource(). Andernfalls denken Sie über die Vorteile des einen oder anderen in Ihrem speziellen Fall nach.

EDIT2:

Dies ist ein großer Artikel, von Phil Sturgeon (PyroCMS und PHP-Figur), über die Vorteile der manuell alle Ihre Routen bauen: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil.

+0

Ich bin mir nicht sicher, ob ich deine Antwort verstehe. Warum sollte ich "Route :: controller" anstelle von "Route :: resource" verwenden, wenn beide dasselbe erreichen? "Route :: controller" scheint ein komplizierterer Prozess zu sein, um einen REST-fähigen Controller einzurichten, da er Konvention bricht und den Controller-Methoden das HTTP-Verb voranstellt. Gibt es einen Grund, es über 'Route :: resource' zu ​​verwenden? Wenn ich 'Route :: resource' verwende, brauche ich keine Controller-Methoden zum Indexieren, Erstellen, Speichern, Anzeigen, Bearbeiten, Aktualisieren und Zerstören, oder? Hinzufügen oder Entfernen von Methoden zu diesem wird in den verfügbaren Routen widerspiegeln? – Iain

+0

Nur bearbeitet, um zu klären. –

+3

Eine weitere Bearbeitung, nur um einen Link zu einem Artikel hinzuzufügen. –

5

@ Antonios Antwort ist gut. Lassen Sie mich etwas Ähnliches und Wichtigeres etwas prägnanter sagen. In routes.php:

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

die Ressource Methode verwenden macht Laravel CRUD-Funktionalität übernehmen und es sieht nur für seine sechs vorgefertigte CRUD Methoden: Index, erstellen, zu speichern, zu zeigen, zerstören, etc. Es gewann‘ t "sehen" Sie alle anderen neuen Methoden, die Sie dort erstellen.

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

die Controller-Methode ermöglicht es Ihnen, benutzerdefinierte Methoden/Seiten zu erstellen. Laravel sucht nach ihnen, wenn Sie die Methode/den Seitennamen mit einem HTTP-Verb voranstellen. In Ihrer 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

Viel klar in weniger Worten – Yash