代码之家  ›  专栏  ›  技术社区  ›  Abanoub

未调用组路由中间件

  •  0
  • Abanoub  · 技术社区  · 6 年前

    我要做的是用一个中间件对多个前缀进行分组:

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

    我已经添加了 centralize 中间件到 kernel :

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

    但是中间件根本没有被调用,这里有没有什么东西丢失?

    编辑:它直接指向家的视图,我正在这样做 dd 里面 middleware 但它从未到达那里!

    编辑:中间件代码:

    <?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()
        {
            //...
        }
    }
    

    编辑:我也尝试过:

    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 () {
    //..
                    });
                });
    
            });
        });
    });
    

    但是有了相同的结果,它就永远不会碰到中间件!

    编辑:使用清除缓存 artisan 手动也不起作用!

    2 回复  |  直到 6 年前
        1
  •  0
  •   Don't Panic    6 年前

    你在一次编辑中提到:

    它可以直接看到家里的景色

    所以你访问的网址实际上是 / . 正如注释中所阐明的,“home”路由被定义为嵌套在前缀中。但这意味着这确实是一条通往 /fr/france/paris/somewhere/ 一条路线 / .

    这个 prefix 在路由中表示“此路由应用于具有此前缀的URI”。如果URI不包含该前缀,则不会应用此路由。

    那就意味着没有路可走了 / 访问它将:

    • 不开火 centralize 中间件;

    • 找不到匹配的路线,扔404;

    如果你想申请 集中化 中间件到您的主路由,您需要将其放在该组中,但在前缀之外:

    Route::middleware(['centralize'])->group(function () {
    
        Route::get('/', 'HomeController@index')->name('home');
    
        Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
            // ... 
        });
    });
    
        2
  •  2
  •   Bhuvanesh Soni    6 年前

    组路由中间件如下所示:

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

    在app/http/kernal.php中

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

    应用程序内/http/middleware/centralemiddleware.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);
            }
        }
    }