Я пытаюсь создать структуру URL-адресов API с вложенными маршрутами 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
(привязанный к модели 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
чтобы максимально routes.php
. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь нажать или изменить URL-адрес изменения или обновления (/api/v1/tables/<id>/settings/<edit|update>
), он фактически ищет URL-адрес в форме из /api/v1/tables/<id>/settings/<another_id>/edit
. Но я хочу, чтобы он использовал идентификатор таблицы, а не имел новый идентификатор настроек в URL-адресе.
Есть ли способ использовать вложенный контроллер ресурсов таким образом? Или я должен использовать другой метод?
Если вы переустановите порядок ресурсов - я думаю, что это сработает:
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')));
});
/api/v1/tables/1/settings/edit
не работает, но/api/v1/tables/1/settings/1/edit
прежнему работает.