Laravel - 对所有路由使用 (:any?) 通配符?

2022-08-30 08:36:30

我在路由方面遇到了一些麻烦。

我正在开发 CMS,我需要两个主要路由。 和。控制器用于路由,控制器应用于除 以外的任何操作。然后,从控制器中,我将解析URL并显示正确的内容。/admin/(:any)admin/adminview/adminview

这就是我所拥有的:

Route::get(array('admin', 'admin/dashboard'), array('as' => 'admin', 'uses' =>'admin.dashboard@index'));
Route::any('(:any)', 'view@index');

第一条路线有效,但第二条路线无效。我稍微玩了一下,似乎如果我使用没有问号,它只有在我之后放一些东西时才有效。如果我确实把问号放在那里,它根本不起作用。(:any)/

我希望以下所有路线都转到view@index:

/
/something
/something/something
/something/something/something
/something/something/something/something
...etc...

这有可能而不硬编码一堆(我甚至不知道工作)?(:any?)/(:any?)/(:any?)/(:any?)

最好的方法是什么?


答案 1

拉拉维尔 5

此解决方案在 Laravel 5 上运行良好:

Route::get('/admin', function () {

  // url /admin

});

Route::get('/{any}', function ($any) {

  // any other url, subfolders also

})->where('any', '.*');

流明 5

这是针对流明的:

$app->get('/admin', function () use ($app) {
  //
});

$app->get('/{any:.*}', function ($any) use ($app) {
  //
});

答案 2

达到404状态对我来说似乎有点不对劲。这可能会让您在记录404时遇到各种问题。我最近在Laravel 4中遇到了相同的通配符路由问题,并通过以下代码段解决了它:

Route::any('{slug}', function($slug)
{
    //do whatever you want with the slug
})->where('slug', '([A-z\d-\/_.]+)?');

这应该以受控的方式解决您的问题。正则表达式可以简化为:

'(.*)?'

但是,您应该自行承担使用风险。

编辑(添加):

由于这会覆盖很多路由,因此应考虑将其包装在“App::before”语句中:

    App::before(function($request) {
            //put your routes here
    });

这样,它就不会覆盖您稍后定义的自定义路由。


推荐