Laravel - маршрутизация дочернего контроллера на дочернем маршруте

У меня есть следующий маршрут:

Route::controller('/boards', 'BoardController');

который отвечает на следующие маршруты:

/boards -> function: getIndex()
/boards/board/Some-board-Alias -> function: getBoard()

что я хочу сделать, так это - когда я вхожу в следующий маршрут:

/boards/board/Some-board-Alias/items

он выполнит "BoardItemController", функцию: getItem()

Я попытался сделать что-то вроде этого:

Route::controller('/boards/board/{board_alias}/items', 'BoardItemController');

Но когда я вхожу в следующий маршрут:

/boards/board/Some-board-Alias/items

он отображает содержимое из:

/boards/board/Some-board-Alias

Похоже, он рассматривает «элементы» как параметр, а не как часть маршрута. есть ли способ использовать другой контроллер для подмаршрута?


Просто чтобы было понятно Маршрут:

/boards/board/Some-board-Alias

Должен получить доступ к BoardController@getBoard (используя Route::controller)

/boards/board/some-board-Alias/items

Следует также получить доступ к BoardItemController@getIndex (используя Route::controller):

/boards/board/some-board-alias/items/item/123

Должен получить доступ к BoardItemController@getItem($id) (используя Route::controller)


person Vlad Kucherov    schedule 28.11.2013    source источник
comment
будет очень легко, если вы сопоставите звонки. без него коды всегда будут очень грязными и ненадежными. (если что-то менять в будущем, может быть головная боль).   -  person itachi    schedule 28.11.2013
comment
Что вы имеете в виду сопоставление вызовов?   -  person Vlad Kucherov    schedule 17.01.2014


Ответы (1)


Вы можете определить свои маршруты следующим образом. Порядок важен, так как Laravel выберет первый маршрут, соответствующий шаблону URL.

// If it's this specific route, go to `BoardItemController->getItem()`
Route::get('boards/board/{board_alias}/items', 'BoardItemController@getItem');
// If not, try to find another one in the rest of the file
Route::controller('boards', 'BoardController');

Затем в вашем контроллере:

// BoardItemController.php
public function getItem($alias)
{
    // do awesome stuff
}

В качестве примечания: не используйте косую черту при определении маршрутов:

Route::controller('boards'); // right
Route::controller('/boards'); // wrong
person Manuel Pedrera    schedule 28.11.2013
comment
Спасибо за замечание, принял это к сведению. То, что вы упомянули о маршрутах размера, относится к маршруту ресурсов. если вы сделаете, скажем, /board/bonzo, он выполнит функцию getBonzo() в BoardController - это поведение, которое я хочу. - person Vlad Kucherov; 28.11.2013
comment
@VladKucherov исправлено :) - person Manuel Pedrera; 28.11.2013
comment
Что ж, это рабочая идея, но, как и в случае с BoardController, BoardItemController также должен работать как контроллер. Я не хочу сопоставлять все доступные функции внутри BoardItemController. boards/board/{board_alias}/items должен выполнять getIndex(), а boards/board/{board_alias}/items/item/123 должен выполнять getItem($id) и так далее... - person Vlad Kucherov; 28.11.2013
comment
Что ж, боюсь, вам следует пересмотреть свои URL-адреса. - person Manuel Pedrera; 28.11.2013
comment
Печально, вы уверены, что это невозможно? - person Vlad Kucherov; 28.11.2013
comment
Я не могу понять, как фреймворк будет различать, когда использовать BoardController и BoardItemController с этими требованиями. Но нет, я не уверен, что это невозможно... Может быть, у кого-то есть лучший ответ. - person Manuel Pedrera; 28.11.2013
comment
Что ж, я нашел рабочее решение, но оно довольно неприятное: Route::controller('/boards/board/{board_alias}/items', 'BoardItemController'); Route::controller('/boards', 'BoardController'); - person Vlad Kucherov; 28.11.2013