【问题标题】:Group route middleware not being called未调用组路由中间件
【发布时间】:2019-07-05 19:03:03
【问题描述】:

我正在尝试将多个前缀与一个中间件组合在一起:

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,
    ...
];

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

编辑:它直接进入房屋的视图,我在 middleware 内部做 dd 但它永远不会到达那里!

编辑:中间件代码:

<?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 和手动清除缓存也不起作用!

【问题讨论】:

  • 你得到了什么消息
  • @MD.JubairMizan 它直接进入 home 的视图,我在中间件内部做 dd 但它永远不会到达那里!
  • 加你middleware问题代码。
  • 能否添加中间件类代码。另请查看this 是否有帮助。
  • 请添加中间件代码

标签: php laravel laravel-5.7 laravel-middleware


【解决方案1】:

您在一次编辑中提到:

它直接进入家庭视图

所以您访问的 URL 实际上是 /。正如 cmets 中所阐明的,“home”路由被定义为嵌套在前缀内。但这意味着它确实是/fr/france/paris/somewhere/ 之类的路线,不是/ 的路线。

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

这意味着/ 没有路线,访问它会:

  • 不触发 centralize 中间件;

  • 找不到匹配的路由,所以抛出404;

如果您想将 centralize 中间件应用到您的主路由,您需要将它放在该组内,但在前缀之外:

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

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

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

【讨论】:

    【解决方案2】:

    分组路由中间件是这样调用的:

    在路由/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,
      ];
    

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

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多