Laravel 4路线,参数数量不受限制

时间:2014-02-03 08:30:05

标签: php laravel laravel-4 laravel-routing

我正在尝试为无限数量的网址级别创建动态路由。

这是我目前的路线

Route::get('{pageLink}', array('uses' => 'SiteController@getPage'));

这适用于第一级。所以像something.com/foo/这样的网址会起作用。但是,如果我有类似于something / 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的结尾?

感谢。

2 个答案:

答案 0 :(得分:23)

您可以尝试这样的事情:

//routes.php
Route::get('{pageLink}/{otherLinks?}', 'SiteController@getPage')->where('otherLinks', '(.*)');

请记住将上面的内容放在routes.php文件的最后(底部),因为它就像一个'catch all'路由,因此您必须首先定义所有“更具体”的路由。

//controller 
class SiteController extends BaseController {

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

}

这种方法应该让你使用无限量的参数,所以这就是你需要的。

答案 1 :(得分:1)

@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]+');