我有这个简单的中间件
<?php
namespace App\Http\Middleware;
use Closure;
use Session;
use App;
class SetPageLanguage
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Session::has('language'))
{
$lang = Session::get('language');
App::setLocale($lang); // still don't know which one to use, but I'll figure it out ;)
app()->setLocale($lang);
}
return $next($request);
}
}
哪个应该在每个请求之前运行。所以我将其添加到内核中:
class Kernel extends HttpKernel
{
protected $middleware = [
...
\App\Http\Middleware\SetPageLanguage::class, // middleware for setting the language when loading a page
];
但是它不起作用。它永远不会运行。
另一方面,如果我将其放入routeMiddleware中,就像这样:
protected $routeMiddleware = [
...
'localization' => \App\Http\Middleware\SetPageLanguage::class,
...
并在每条路线上调用它,例如:
Route::GET('/', 'AnonymController@home')->middleware('localization');
它完美地工作!但我不想这样做。我希望它像预期的那样在每个请求之前自动运行。 我想念什么?
我对laravel和Php很陌生,所以我确定我不了解重要的东西。
我看了一些教程,阅读了几篇文章,并在Stack Overflow上搜索了答案。仍然无法弄清楚。
如何使我的中间件在每个请求之前运行?
谢谢。
答案 0 :(得分:3)
它可能正在运行,但是全局中间件在路由中间件之前运行。了解其他中间件在做什么以及它们被调用的顺序很重要。
如果您查看'web'
中间件组,则会看到以下中间件:
\Illuminate\Session\Middleware\StartSession::class,
Laravel应用程序中无法立即提供会话。 StartSession中间件是启动Web路由会话的工具。 API路由不使用会话,因为它们是无状态的。
因此,此中间件可能依赖于会话数据,因此可能属于会话中间件下方的Web组。