Abanoub
Abanoub

Reputation: 3809

Group route middleware not being called

What I'm trying to do is group multiple prefixes with one middleware:

Route::group(['middleware' => ['centralize']], function () {
    Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
        Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
            Route::group(['prefix' => \App\Utilities\Centralization::setCity()], function () {
                Route::group(['prefix' => \App\Utilities\Centralization::setArea()], function () {

                    //routes
                });
            });

        });
    });
}); 

I have added the centralize middleware to kernel:

protected $routeMiddleware = [
    ...
    'centralize'=> \App\Http\Middleware\Centralize::class,
    ...
];

But the middleware is not being called at all, is there is something missing here?

EDIT: it goes directly to the view of the home, I am doing dd inside of the middleware but it never reaches there!

EDIT: middleware code:

<?php

namespace App\Http\Middleware;

use App\Utilities\Centralization;
use Closure;
use Illuminate\Http\RedirectResponse;

class Centralize
{
    /**
     * @var  \Illuminate\Http\Request
     */
    private $request;

    /**
     * @var  array
     */
    private $params;

    private $location;

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle(\Illuminate\Http\Request $request, Closure $next)
    {
        $this->request = $request;

        dd('hit');

        $this->params = explode('/', $request->getPathInfo());


        $this->figureLocale();
        $this->figureCountry();
        $this->figureCity();
        $this->figureArea();
        $this->figureLocation();

        $redirection = implode('/', $this->params);

        if ($request->getPathInfo() !== $redirection) {

            return new RedirectResponse($redirection, 302, ['Vary' => 'Accept-Language']);
        }

        \View::share([
            'countries' => Centralization::getCountries(),
            'cities' => Centralization::getCities(),
            'areas' => Centralization::getAreas(),
            'location' => $this->location
        ]);

        return $next($request);
    }

    private function figureLocale()
    {
        //...
    }

    private function figureCountry()
    {
       //..
    }

    private function figureCity()
    {
       //...
    }

    private function figureArea()
    {
        //...
    }

    private function figureLocation()
    {
        //...
    }
}

EDIT: I also have tried:

Route::middleware(['centralize'])->group(function () {
    Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
        Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
            Route::group(['prefix' => \App\Utilities\Centralization::setCity()], function () {
                Route::group(['prefix' => \App\Utilities\Centralization::setArea()], function () {
//..
                });
            });

        });
    });
});

But with the same result , it never hits the middleware!

EDIT: clearing cache using artisan and manual doesn't work either!

Upvotes: 0

Views: 657

Answers (2)

Don&#39;t Panic
Don&#39;t Panic

Reputation: 14520

You mentioned in one edit that:

it goes directly to the view of the home

So the URL you are visiting is actually /. And as clarified in the comments, the "home" route was defined nested inside the prefixes. But that means it is really a route for something like /fr/france/paris/somewhere/, and not a route for /.

The prefix in the route means "this route applies to URIs with this prefix". If a URI does not include that prefix, this routing is not applied.

So that means there is no route for /, and visiting it will:

  • not fire the centralize middleware;

  • not find a matching route, so throw a 404;

If you want to apply your centralize middleware to your home route, you'll need to place it inside that group, but outside the prefixes:

Route::middleware(['centralize'])->group(function () {

    Route::get('/', 'HomeController@index')->name('home');

    Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
        // ... 
    });
});

Upvotes: 1

Bhuvanesh Soni
Bhuvanesh Soni

Reputation: 206

Group route middleware called like this:

In routes/web.php

Route::group(['middleware' => ['centralize']], function () {
  Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
    Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
          //routes
         });
    });
});

In app/Http/kernal.php

protected $routeMiddleware = [
    'centralize' => \App\Http\Middleware\CentralizeMiddleware::class,
  ];

In app/Http/Middleware/CentralizeMiddleware.php

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CentralizeMiddleware
{
    public function handle($request, Closure $next)
    {
        if (//Your Condition) {
            //If true
        }
        else {
        return $next($request);
        }
    }
}

Upvotes: 3

Related Questions