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))