如何在Laravel 5.X中制作Catch-All路线

Tar*_*dam 26 php routing laravel-5

我需要一个laravel 5.2 routes.php条目,它将捕获网站特定domain.com/premium-section的所有流量,以便我可以在访问高级内容之前提示人们成为成员.

我会回答我自己的问题〜希望人们可以使用这些信息.

lag*_*box 41

你也可以通过在参数上使用正则表达式来捕获'all'.

Route::group(['prefix' => 'premium-section'], function () {
    // other routes
    ...
    Route::get('{any}', function ($any) {
        ...
    })->where('any', '.*');
});
Run Code Online (Sandbox Code Playgroud)

如果没有使用可选参数定义路由,也可以捕获整个组.

Route::get('{any?}', function ($any = null) {
    ...
})->where('any', '.*');
Run Code Online (Sandbox Code Playgroud)

最后一个也会捕获'domain.com/premium-section'.

  • 感谢您的回答.我想知道为什么Laravel没有被编码用于简单的`Route:any('*')`! (3认同)
  • 谢谢您的解决方案!只是提示,最好不要使用闭包,因为它们无法缓存。```Route::get('/{action}', 'SiteController@defaultPageHandler')->where('action', '.*');``` 会更好;) (2认同)
  • @LeonidDashko`Route :: fallback`会更好,因为它只是一个快捷方式. (2认同)

小智 21

这样做的诀窍:

Route::any('/{any}', 'MyController@myMethod')->where('any', '.*');
Run Code Online (Sandbox Code Playgroud)


小智 7

Laravel 现在有一个内置方法:

https://laravel.com/docs/master/routing#fallback-routes


Tar*_*dam 1

  1. 在 app/Http/routes.php 中,我创建了一个路由,该路由将捕获 domain.com/premium-section/anywhere/ey/try/to/go 内的所有流量,并尝试在 PremiumSectionController 内查找并执行匹配的函数
  2. 但没有任何匹配方法,只是一个包罗万象的方法。

    Route::group(['as' => 'premium-section::',
                  'prefix' => 'premium-section',
                  'middleware' => ['web']],
                  function(){
                     Route::any('', 'PremiumSectionController@premiumContentIndex');
                     Route::controller('/', 'PremiumSectionController');
    
                  });
    
    Run Code Online (Sandbox Code Playgroud)

    namespace App\Http\Controllers;

    use ...

    class PremiumSectionController extends Controller{

        public function premiumContentIndex(){
           return 'no extra parameters';
        }

        //magically gets called by laravel
        public function missingMethod($parameters = array()){
            return $parameters;
        }

    }
Run Code Online (Sandbox Code Playgroud)