Laravel - Маршрут :: ресурс против Маршрута :: контроллер

138

Я читал документы на веб-сайте Laravel, в Stack Overflow и в Google, но до сих пор не понимаю разницу между Route::resourceи Route::controller.

В одном из ответов говорится, что Route :: resource был для crud. Однако с Route :: controller мы можем выполнить то же самое, что и с Route :: resource, и мы можем указать только необходимые действия.

Они похожи на братьев и сестер:

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

Как мы можем выбрать, что использовать? Что такое хорошая практика?

Sonique
источник
12
Просто примечание для пользователей Laravel 5.2, между тем неявные контроллеры устарели.
Рой

Ответы:

283

Контроллер ресурсов RESTful

RESTful контроллер ресурсов устанавливает некоторые маршруты по умолчанию для вас и даже имена им.

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

Дает вам эти названные маршруты:

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

И вы бы настроить свой контроллер примерно так (действия = методы)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Вы также можете выбрать, какие действия будут включены или исключены следующим образом:

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

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

Документация RESTful Resource Controller


Неявный контроллер

Неявный контроллер является более гибким. Вы перенаправлены на методы вашего контроллера на основе типа и имени HTTP-запроса. Однако для вас не определены имена маршрутов, и он будет перехватывать все подпапки для одного и того же маршрута.

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

Приведет вас к настройке контроллера с помощью своего рода схемы именования 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'
    }

}

Документация неявного контроллера


Хорошей практикой является использование того, что вам нужно, согласно вашим предпочтениям. Лично мне не нравятся неявные контроллеры , потому что они могут быть грязными, не дают имен и могут сбивать с толку при использовании php artisan routes. Обычно я использую контроллеры RESTful Resource в сочетании с явными маршрутами.

ryanwinchester
источник
1
Если мы используем несколько из маршрутов ресурсов (может быть, индекс, показать), почему бы не использовать статические маршруты Route :: get (...)? Я думаю, что это не лучше не хуже, чем использовать массив ('only' => array ('index', 'show'). И какой метод используется для контроллера RESTFull, когда мы запрашиваем что-то вроде 'user / 123', getIndex () работает для 'user /', но с user / 123 я получаю ошибку NotFoundHttpException (пробовал разные имена getView и другие, работает только при объявлении как Controller @ getView)?
Sonique
Может кто-нибудь уточнить, для чего предназначен ресурс.edit? Это метод GET, поэтому я предполагаю, что он должен содержать полную информацию о ресурсе, а не только ограниченную информацию через resource.show?
Энтони
1
@Anthony - resource.editэто отображение редактируемого вида, в основном, формы для редактирования существующего ресурса.
Райанвинчестер
@fungku Это интересно .. так вы говорите, что resource.edit на самом деле будет возвращать HTML вместо JSON?
Энтони
2
@ Энтони Вообще, (и насколько я знаю) да. resource.editи, resource.createкак правило, для пользовательского интерфейса ... рендеринга представления с HTML-формами. Эти формы будут PUT / POST resource.updateи resource.storeсоответственно. Если вы этого не делаете, вы можете просто игнорировать их и избавиться от методов edit () и create () в вашем контроллере.
Райанвинчестер
3

Для метода контроллера маршрута мы должны определить только один маршрут. В методе get или post мы должны определить маршрут отдельно.

И метод ресурсов используется для создания нескольких маршрутов для обработки различных действий Restful.

Вот документация Laravel об этом.

Ахмад Шариф
источник