Маршрут 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]+');