Laravel 4 - Route:: resource vs Route:: controller. Что использовать?
Я понимаю, что контроллер ресурсов может иметь следующие методы
index
show
create
edit
store
update
destroy
Теперь предположим, что у меня есть следующие действия, которые необходимо выполнить в дополнение к действиям ресурса:
- Пользователь пытается войти в систему.
- Администратор хочет найти пользователя по электронной почте/имени
- Пользователь запрашивает сообщение через slug
Являются ли контроллеры ресурсов бесполезными для вышеупомянутых функций? Если вы программируете API, я, очевидно, хочу индексировать, показывать, редактировать, создавать, уничтожать... но также и логин, поиск, поиск и т.д.
Можно ли маршрутизировать оба типа контроллера? например.
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');
});
});
Или я должен просто забыть о контроллере ресурсов и вместо этого использовать спокойный контроллер?
Ответы
Ответ 1
Просто используйте контроллер ресурсов, добавьте эти другие методы к тому же контроллеру и добавьте маршруты к этим методам напрямую:
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');
});
});
P.S. Я вообще избегаю использования Route::controller()
. Это слишком двусмысленно.
Ответ 2
Одна из проблем, связанных с контроллерами ресурсов, заключается в том, что вы используете именованные маршруты, с префиксами групп все это превращается в большой беспорядок. если вы хотите внести небольшое изменение в свой префикс, вам необходимо внести изменения во все виды и контроллеры. т.е. вы не можете использовать всю мощь названных маршрутов.
Я следую этой модели при разработке моих приложений для laravel.
Route::group( [ 'prefix' => 'admin' ], function(){
Route::resource('pages', 'PageController', [
'names' => [
'show' => 'page',
'edit' => 'page.edit'
],
'only' => [
'show',
'edit'
]
]);
});
чтобы у меня были следующие преимущества.
- есть только маршруты, которые вам нужны.
- все URL-адреса явно названы
и я могу с легкостью генерировать URL-адреса, используя синтаксис, даже если я делаю изменения в именах префикса или ресурса, URL-адреса не затрагиваются
URL::route('page', array($id))