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


138

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

Одна з відповідей сказала Route :: ресурс для сирого. Однак за допомогою контролера Route :: ми можемо виконати те саме, що і з ресурсом Route ::, і ми можемо вказати лише необхідні дії.

Вони схожі на братів і сестер:

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

Як ми можемо вибрати, що використовувати? Що таке хороша практика?


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 Controller Resource


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

Неявний контролер є більш гнучким. Ви перейдете до методів контролера на основі типу та імені запиту 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 в поєднанні з явними маршрутами.


1
Якщо ми використовуємо декілька ресурсних маршрутів (можливо, покажчик, показ), чому б не використовувати статичні маршрути Route :: get (...)? Я думаю, що це не краще, ніж гірше, ніж використовувати array ('only' => array ('index', 'show'). І який метод використовується для контролера RESTFull, коли ми запитуємо щось на зразок 'user / 123', getIndex () працює для 'user /', але з користувачем / 123 я отримую помилку NotFoundHttpException (пробував різні імена getView та інші, працює лише тоді, коли оголошується як Controller @ getView)
Sonique

Хтось може уточнити, для чого призначений "resource.edit"? Це метод GET, тому я припускаю, що він повинен мати повну повну інформацію про ресурс, а не лише обмежену інформацію через "resource.show"?
Ентоні

1
@Anthony - resource.editце показати вид редагування, в основному, форму для редагування наявного ресурсу.
ryanwinchester

@fungku Це цікаво .. так ви кажете, що resource.edit фактично повертає HTML замість JSON?
Ентоні

2
@Anthony Взагалі, (і наскільки я знаю) так. resource.editі resource.create, як правило, для інтерфейсу ... рендеринга представлення з HTML-формами. Ці форми будуть PUT / POST відповідно resource.updateта resource.storeвідповідно. Якщо ви цього не робите, ви можете просто проігнорувати їх та позбутися методів edit () та create () у своєму контролері.
ryanwinchester

3

Для методу контролера маршруту ми повинні визначити лише один маршрут. Метод get або post повинен визначати маршрут окремо.

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

Ось документація Laravel про це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.