在Laravel中,当URL段数大于1时,RouteGroup中的中间件不要运行

In Laravel when is the number of URL segments more than one, middleware don't run in RouteGroup

我需要将位置添加到所有 URL。我在“RouteServiceProvider.php”中使用了“mapWebRoutes”,如下所示:

    protected function mapWebRoutes()
{
    $locale = Request::segment(1);
    Route::group([
        'middleware' => 'web',
        'namespace' => $this->namespace,
        'prefix' => $locale
    ], function ($router) {
        require base_path('routes/web.php');
    });
}

但是当段数大于1时,中间件不会运行。 例如,位置正确添加到下面的地址。

http://example.com/test 在 return 来自中间件之后 => http://example.com/en/test

但是位置没有添加到下面的地址:

http://example.com/test1/test2

这意味着中间件还没有运行。我在中间件的第一行添加 echo 'test'; exit(); 以确保中间件是 运行ning。但是当段数大于1时,中间件不会运行.

我的中间件代码是:

    public function handle($request, Closure $next)
{
    if (!array_key_exists($request->segment(1), config('translatable.locales'))) {
        // Store segments in array
        $segments = $request->segments();
        // Set the default language code as the first segment
        $segments = array_prepend($segments, config('app.fallback_locale'));

        // Redirect to the correct url
        return redirect()->to(implode('/', $segments));
    }
    return $next($request);
}

我将 mapWebRoutes() 更改为以下代码并解决了问题:

 protected function mapWebRoutes()
{
    if (!array_key_exists(Request::segment(1), config('translatable.locales'))) {
        Route::group([
            'middleware' => ['web'],
            'namespace' => $this->namespace
        ], function ($router) {
            require base_path('routes/web.php');
        });
    } else {
        $locale = Request::segment(1);
        Route::group([
            'middleware' => ['web'],
            'namespace' => $this->namespace,
            'prefix' => $locale
        ], function ($router) {
            require base_path('routes/web.php');
        });
    }
}

谢谢。 我按照你的想法也添加了一个条件。

我的 mapWebRoutes 方法中有这个:

if (!Language::isValid($locale))
    $locale = '';

Route::middleware(['web', 'lang'])
    ->namespace($this->namespace)
    ->prefix($locale)
    ->group(function () {
        require base_path('routes/web/test.php');
        require base_path('routes/web/general.php');
        require base_path('routes/web/blog.php');
        require base_path('routes/web/payments.php');
    });

如果语言无效,空值将省略前缀并调用中间件。