当设置为全局中间件时,Laravel中间件不起作用

时间:2016-07-29 17:10:30

标签: php laravel-5.2 middleware

我有一个中间件,用于通过在每个请求之前从会话中获取值来设置我的laravel应用程序的语言环境。

我有一个设置此变量的路由,我将此中间件应用于所有路由,包括此路由。

这是我的中间件:

namespace App\Http\Middleware;

use App;
use Closure;
use Session;

class LocaleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Session::has('locale')){
            App::setLocale(Session::get('locale'));
        }

        return $next($request);
    }
}

这是我设置语言的路线

public function setLang(string $lang)
{
    Session::put('locale', $lang);

    return back();
}

现在问题就出现了。如果我将中间件设置为全局,则在内核文件中,它不会生效。语言环境设置不正确。

如果我手动将该中间件应用于每个路由,它就可以工作。

如果我将该中间件分配给内核文件中的web中间件组,该组件会自动应用于所有路由,那么它也能正常工作。

这让我很困惑。请与我分享你的建议!谢谢:))

1 个答案:

答案 0 :(得分:2)

我终于找到了答案。

负责启动会话的中间件不是全局中间件,它只在web中间件组中。因此,laravel无法访问会话,因为我的中间件在它们启动之前就已运行。 / p>