2013-09-30 11 views
14

Rozumiem, że kontroler zasobów może mieć następujące metodyLaravel 4 - Route :: resource vs Route :: controller. Które użyć?

index 
show 
create 
edit 
store 
update 
destroy 

Załóżmy teraz mam następujące działania, które muszą być wykonywane w uzupełnieniu do działań zasobów:

  • użytkownik próbuje się zalogować .
  • Admin pragnie znaleźć użytkownika poprzez e-mail/po imieniu
  • użytkownik zażąda post przez niego znajduje się ślimak

Czy kontrolery zasobów są bezużyteczne dla powyższej funkcji? Jeśli programujesz API, oczywiście chcę indeksować, pokazywać, edytować, tworzyć, niszczyć ... ale także logować, znajdować, szukać itp ...

Czy można kierować do obu typów kontrolerów? na przykład

Route::group(['prefix' => 'api'], function() { 
    Route::group(['prefix' => 'v1'], function() { 
     // Resource Controller 
     Route::resource('posts', 'Api\V1\PostsResourceController'); 

     // Restful Controller 
     Route::controller('posts', 'Api\V1\PostsController'); 
    }); 
}); 

Czy powinienem po prostu zapomnieć o kontrolerze zasobów i zamiast tego użyć sterownika?

+0

użyłbym zasób Trasa tylko wtedy, gdy mam akcje CRUD do wykonania w tej logice. W przeciwnym razie używam trasy kontrolera. Zasób pierwszy tworzy wiele tras do Twojej aplikacji, a jeśli ich nie używasz, jest to marnotrawstwem. – arma

+0

@arma można dodać do czarnej listy lub dodać do białej listy te trasy: http://laravel.com/docs/4.2/controllers#restful-resource-controllers –

Odpowiedz

32

Wystarczy użyć kontrolera zasobów, add those other methods to that same controller, and add routes to those methods directly:

Route::group(['prefix' => 'api'], function() 
{ 
    Route::group(['prefix' => 'v1', 'namespace' => 'Api\V1'], function() 
    { 
     // Add as many routes as you need... 
     Route::post('login', '[email protected]'); 
     Route::get('find', '[email protected]'); 
     Route::get('search', '[email protected]'); 

     Route::resource('posts', 'PostsResourceController'); 
    }); 
}); 

PS: Generalnie unikałem używania Route::controller(). It's too ambiguous.

+0

Dzięki za to ... Myślę, że próbowałem skrócić trasy, chcąc dotrzeć do kontroler i zasób! – Gravy

+0

Witam, czytam artykuł, ale nie do końca rozumiem, dlaczego jest on zbyt wieloznaczny. Możesz wytłumaczyć? Dlaczego zasób nie jest abuzywny (zasoby tworzą więcej tras i nie sprawdzają istnienia działania)? Dlaczego laravel ma trasy i kontrolerów. Dlaczego nie używać tylko zasobu, jeśli jest lepszy. To mylą przyszłych rzemieślników.Dzięki – Sonique

+1

@VitalyLarchenkov - ** zasoby tworzą więcej tras **. Nie. Zasób tworzy tylko te trasy, których potrzebujesz (jeśli nie potrzebujesz ich wszystkich, powinieneś podać ['only' lub' except'] (http://i.imgur.com/NVIy57C.png), zgodnie z opisem [w the docs] (http://laravel.com/docs/controllers#resource-controllers) –

1

Jednym z problemów związanych z kontrolerami zasobów są, gdy używasz nazwanych tras, z przedrostkami grupowymi wszystko to okazuje się wielkim bałaganem. jeśli chcesz wprowadzić niewielką zmianę w prefiksie, musisz wprowadzić zmiany w widokach i kontrolerach. tj. nie można uzyskać pełnej mocy nazw nazwanych tras.

Postępuję zgodnie z tym modelem podczas opracowywania aplikacji dla laravel.

Route::group([ 'prefix' => 'admin' ], function(){ 
     Route::resource('pages', 'PageController', [ 
      'names' => [ 
       'show' => 'page', 
       'edit' => 'page.edit' 
      ], 
      'only' => [ 
       'show', 
       'edit' 
      ] 

     ]); 

    }); 

dzięki czemu mam następujące zalety.

  • są tylko te trasy, których potrzebujesz.
  • wszystkie adresy URL są wyraźnie nazwany

i mogę generować adresy URL wygodnie przy użyciu składni, nawet jeśli i dokonać zmiany nazwy przedrostek lub zasobów URL nie są dotknięte

URL::route('page', array($id))