2015-01-06 4 views
0

Я пытаюсь создать структуру URL API с вложенными маршрутами Laravel как следующее:RESTful вложенных Laravel маршруты

/api/v1/tables -- list tables 
/api/v1/tables/<id> -- show one table data 
/api/v1/tables/<id>/update (post) -- update table data (inline editing of table, so edit screen not needed) 
/api/v1/tables/<id>/settings -- get settings for that table 
/api/v1/tables/<id>/settings/edit -- edit settings for that table 
/api/v1/tables/<id>/settings/update (post) -- save settings for that table 

Я пытался сделать это с вложенными ресурсами и двумя контроллеров. TableController (привязанный к модели таблицы) будет управлять данными в таблице, а контроллер (привязанный к модели TableSettings) будет управлять настройками (имена столбцов, порядок, видимость и т. Д.). Идея заключалась в том, что вы вызывали бы /api/v1/tables/<id>, чтобы получить данные для таблицы, и /api/v1/tables/<id>/settings, чтобы получить настройки, а затем используйте это для построения дисплея.

В моей routes.php у меня есть:

Route::group(array('prefix' => 'api/v1'), function() 
{ 
    Route::resource('tables', 'TablesController', 
        array('only' => array('index', 'show', 'update'))); 
    Route::resource('tables.settings', 'TableSettingsController'. 
        array('only' => array('index', 'edit', 'update'))); 
}); 

Я хотел бы сделать что-нибудь по этому поводу с держать routes.php как можно более чистым. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь нажать или изменить URL-адрес изменения или обновления (/api/v1/tables/<id>/settings/<edit|update>), он фактически ищет URL-адрес в виде /api/v1/tables/<id>/settings/<another_id>/edit. Но я хочу, чтобы он использовал идентификатор таблицы, а не имел новый идентификатор настроек в URL-адресе.

Есть ли способ использовать вложенный контроллер ресурсов таким образом? Или я должен использовать другой метод?

ответ

1

Если переставить порядок ресурсов - Я не думаю, что будет работать:

Route::group(array('prefix' => 'api/v1'), function() 
{ 
    Route::resource('tables.settings', 'TableSettingsController'. 
        array('only' => array('index', 'edit', 'update'))); 
    Route::resource('tables', 'TablesController', 
        array('only' => array('index', 'show', 'update'))); 
}); 
+0

К сожалению, не повезло с этим. '/ api/v1/tables/1/settings/edit' не работает, но'/api/v1/tables/1/settings/1/edit' по-прежнему выполняется. – Samsquanch

Смежные вопросы