Маршрут Laravel 4 с неограниченным количеством параметров

Я пытаюсь создать динамический маршрут для неограниченного количества уровней URL.

Здесь мой текущий маршрут

Route::get('{pageLink}', array('uses' => '[email protected]'));

Это работает для первого уровня. Таким образом, URL-адрес, например something.com/foo/, будет работать. Но если бы у меня было что-то вроде something.com/foo/bar/, это не поймало бы этот URL. Мне нужно, чтобы он соответствовал неограниченным уровням. Таким образом, в моем контроллере он получит переменную от всей ссылки.

Я знаю, что мог бы сделать

Route::get('{pageLink}', array('uses' => '[email protected]'));
Route::get('{pageLink}/{pageLink2}', array('uses' => '[email protected]'));
Route::get('{pageLink}/{pageLink2}/{pageLink3}', array('uses' => '[email protected]'));

Но это просто кажется излишним. Есть ли лучший способ сделать это, чтобы он соответствовал концу URL?

Спасибо.

Ответ 1

Вы можете попробовать что-то вроде этого:

//routes.php
Route::get('{pageLink}/{otherLinks?}', '[email protected]')->where('otherLinks', '(.*)');

Не забудьте поставить выше в самом конце (внизу) файла route.php, поскольку он похож на маршрут "поймать все", поэтому сначала нужно определить все "более конкретные" маршруты.

//controller 
class SiteController extends BaseController {

    public function getPage($pageLink, $otherLinks = null)
    {
        if($otherLinks) 
        {
            $otherLinks = explode('/', $otherLinks);
            //do stuff 
        }
    }

}

Этот подход должен позволить вам использовать неограниченное количество параметров, так что это то, что вам кажется нужным.

Ответ 2

@Fusion https://laravel.com/docs/5.4/routing

Вы можете ограничить формат параметров маршрута, используя метод where на экземпляре маршрута. Метод where принимает имя параметра и регулярное выражение, определяющее, как должен ограничиваться параметр. поэтому {id} является параметром маршрута, а ->where('id', '[0-9]+') является выражением регулярного выражения для этого параметра. Если вам нужно использовать больше параметров, вы можете сделать что-то вроде этого:

Route::get('user/{id}/{id2}', function ($id) { })->where('id', '[0-9]+')->where('id2', '[[0-9]+]');


    Route::get('user/{id}', function ($id) {

    })->where('id', '[0-9]+');