Home » Php » php – How do I make a Catch-All Route in Laravel

php – How do I make a Catch-All Route in Laravel

Posted by: admin April 23, 2020 Leave a comment

Questions:

I need a laravel routes.php entry that will catch all traffic to a specific domain.com/premium-section of the site so that I can prompt people to become members before accessing the premium content.

How to&Answers:

You could also catch ‘all’ by using a regex on the parameter.

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

Also can catch the whole group if no routes are defined with an optional param.

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

This last one would catch ‘domain.com/premium-section’ as well.

Answer:

This does the trick:

Route::any('/{any}', '[email protected]')->where('any', '.*');

Answer:

  1. In app/Http/routes.php I create a route that will catch all traffic within domain.com/premium-section/anywhere/they/try/to/go and attempt to find and execute a matching function within PremiumSectionController
  2. But there aren’t any matching methods, just a catch-all.

    Route::group(['as' => 'premium-section::',
                  'prefix' => 'premium-section',
                  'middleware' => ['web']],
                  function(){
                     Route::any('', '[email protected]');
                     Route::controller('/', 'PremiumSectionController');
    
                  });
    

.

    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;
        }

    }

Answer:

This works for me

// The catch-all will match anything except the previous defined routes.
Route::any('{catchall}', '[email protected]')->where('catchall', '.*');