Я пытаюсь создать динамический маршрут для неограниченного количества уровней URL.
Вот мой текущий маршрут
Route::get('{pageLink}', array('uses' => 'SiteController@getPage'));
Это работает на первом уровне. Таким образом, URL-адрес, например something.com/foo/, будет работать. Но если бы у меня было что-то вроде something.com/foo/bar/, это не поймало бы этот URL. Мне нужно, чтобы он соответствовал неограниченным уровням. Таким образом, в моем контроллере он получит переменную от всей ссылки.
Я знаю, что могу
Route::get('{pageLink}', array('uses' => 'SiteController@getPage')); Route::get('{pageLink}/{pageLink2}', array('uses' => 'SiteController@getPage')); Route::get('{pageLink}/{pageLink2}/{pageLink3}', array('uses' => 'SiteController@getPage'));
Но это просто кажется излишним. Есть ли лучший способ сделать это, чтобы он соответствовал концу URL-адреса?
Благодарю.
Вы можете попробовать что-то вроде этого:
//routes.php Route::get('{pageLink}/{otherLinks?}', 'SiteController@getPage')->where('otherLinks', '(.*)');
Не забудьте поставить выше в самом конце (внизу) файла route.php, поскольку это похоже на маршрут «поймать все», поэтому сначала нужно определить все «более конкретные» маршруты.
//controller class SiteController extends BaseController { public function getPage($pageLink, $otherLinks = null) { if($otherLinks) { $otherLinks = explode('/', $otherLinks); //do stuff } } }
Этот подход должен позволить вам использовать неограниченное количество параметров, так что это то, что вам кажется нужным.
@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]+');