2014-02-03 4 views
10

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

Вот мой текущий маршрут

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-адреса?

Спасибо.

ответ

21

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

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

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

//controller 
class SiteController extends BaseController { 

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

} 

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

+0

Спасибо! Это сработало. – user1218595

+0

Что именно? в {} означает? – Riki137

+1

Это означает, что это необязательно @ Riki137 – BenOfTheNorth

1

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

Вы можете ограничить формат ваших параметров маршрута, используя метод где на экземпляре маршрута. Метод 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]+'); 
+2

Добавьте комментарии и объясните свой ответ. –

+0

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

Смежные вопросы