Laravel 5.4 - 如何使用通配符路由?

3

经过一些试验和研究,似乎在Laravel 5+中Route::when()Route::filter()已被弃用。我需要将所有以members开头的URI路由到同一个控制器。例如:

Route::get('members/home', 'MembersController');
Route::get('members/view/all', 'MembersController');
Route::get('members/any/possible/route', 'MembersController');

我不会知道所有以成员开头的可能路由,因为它们将存储在我的数据库中。 Laravel 4.2 中有类似通配符的东西,我可以在 5.4 中使用吗?

这个想法是让任何以特定前缀开头的路由都去到指定的控制器,然后控制器将比较整个 URI 字符串并检索具有匹配 slug 的页面。

2个回答

10
您可以使用允许任何值的路由参数来实现此操作。例如,(.*)。然后,您需要从单个控制器操作处理所有请求。
Route::get('members/{action}', 'MemberController@all')->where('action', '(.*)');

进一步来说,如果您不知道您的请求是否全部为GET请求,您可以使用:any方法类型。

Route::any('members/{action}', 'MemberController@all')->where('action', '(.*));

{btsdaf} - Jason Ayer
兄弟,这里出现了错误:Route::resource('questions', 'QuestionController')->parameters(['questions' => 'question_slug'])->where(['slug' => '^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$']); - Usman Developer
1
@fubar,你能否更正你在这个答案中的第一个示例?应该是Route::get('members/{action}', 'MemberController@all')->where('action', '(.*)')。 - AdamJones

2
Route::get('/members/{section}', 'MembersController@index' )
       ->where(['section' => '.*']);

或者更好的方法是使用组路由。它可以加快速度并优化您的应用程序。

Route::prefix('members')->group(function () {
    Route::get('{section}', 'MembersController@index' )
        ->where(['section' => '.*']);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接