Laravel - Route :: resource vs Route :: controller

138

Czytałem dokumenty w witrynie Laravel, Stack Overflow i Google, ale nadal nie rozumiem różnicy między Route::resourcei Route::controller.

Jedna z odpowiedzi mówi, że Route :: resource dotyczy crud. Jednak z Route :: controller możemy osiągnąć to samo, co z Route :: resource i możemy określić tylko potrzebne akcje.

Wydają się być jak rodzeństwo:

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

Jak możemy wybrać, czego użyć? Co to jest dobra praktyka?

Sonique
źródło
12
Tylko uwaga dla użytkowników Laravel 5.2, tymczasem niejawne kontrolery są przestarzałe.
Roy

Odpowiedzi:

283

Kontroler zasobów RESTful

Relaksującego kontroler zasobów ustanawia niektórych trasach domyślnych dla ciebie, a nawet nazw nich.

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

Podaje te nazwane trasy:

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

Skonfigurowałbyś swój kontroler mniej więcej tak (akcje = metody)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Możesz także wybrać, które akcje są uwzględniane lub wykluczane w następujący sposób:

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

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

Dokumentacja kontrolera zasobów RESTful


Niejawny kontroler

Niejawny kontroler jest bardziej elastyczny. Zostaniesz przekierowany do metod kontrolera na podstawie typu i nazwy żądania HTTP. Jednak nie masz zdefiniowanych dla siebie nazw tras i spowoduje to przechwycenie wszystkich podfolderów dla tej samej trasy.

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

Doprowadziłoby cię do skonfigurowania kontrolera z rodzajem schematu nazewnictwa 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'
    }

}

Dokumentacja niejawnego kontrolera


Dobrą praktyką jest używanie tego, czego potrzebujesz, zgodnie z własnymi preferencjami. Osobiście nie lubię kontrolerów Niejawnych , ponieważ mogą być bałaganiarskie, nie podają nazw i mogą być mylące podczas używania php artisan routes. Zwykle używam kontrolerów zasobów RESTful w połączeniu z jawnymi trasami.

ryanwinchester
źródło
1
Jeśli używamy kilku tras zasobów (może indeks, pokaż), dlaczego nie użyć tras statycznych Route :: get (...)? Myślę, że nie lepiej nie jest gorzej niż użycie array ('only' => array ('index', 'show'). I jaka metoda jest używana dla kontrolera RESTFull, gdy żądamy czegoś takiego jak 'user / 123', getIndex () działa dla 'user /', ale z user / 123 pojawia się błąd NotFoundHttpException (próbowałem różnych nazw getView i innych, działa tylko wtedy, gdy zadeklarowano jako kontroler @ getView)?
Sonique
Czy ktoś może wyjaśnić, do czego służy „resource.edit”? Jest to metoda GET, więc przypuszczam, że powinna zawierać pełne informacje o zasobie, a nie tylko ograniczone informacje za pośrednictwem „resource.show”?
Anthony
1
@Anthony - resource.editsłuży do pokazania widoku edycji, w zasadzie formularza do edycji istniejącego zasobu.
ryanwinchester,
@fungku To interesujące… więc czy mówisz, że resource.edit w rzeczywistości zwróci HTML zamiast JSON?
Anthony
2
@Anthony Ogólnie (i o ile wiem) tak. resource.editi resource.createsą zwykle przeznaczone dla interfejsu użytkownika ... renderującego widok za pomocą formularzy HTML. Te formularze będą PUT / POST odpowiednio do resource.updatei resource.store. Jeśli tego nie robisz, możesz po prostu je zignorować i pozbyć się metod edit () i create () w kontrolerze.
ryanwinchester
3

W przypadku metody kontrolera trasy musimy zdefiniować tylko jedną trasę. W metodzie get lub post musimy osobno zdefiniować trasę.

Metoda zasobów jest używana do tworzenia wielu tras do obsługi różnych działań Restful.

Tutaj dokumentacja Laravel na ten temat.

Ahmad Sharif
źródło