Laravel 中间件不执行函数
Laravel Middleware not executing functions
我有这个 Locale 中间件,它根据 DB 上的设置设置语言
public function handle($request, Closure $next)
{
$HQ = Branch::where('is_hq', 1)->where('is_active', 1)->first();
$Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
$locale = strtolower($Company['bi__language']->value);
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
return $next($request);
}
但我需要获取当前用户所在的分支,所以我需要先获取 Auth::id() 所以我将代码更改为此以访问 Auth .
public function handle($request, Closure $next)
{
$response = $next($request);
$HQ = Branch::where('is_hq', 1)->where('is_active', 1)->where('user_id', \Auth::id())->first();
$Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
$locale = strtolower($Company['bi__language']->value);
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
return $response;
}
现在我正在让当前用户登录,但问题是它没有执行这段代码
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
Kernel.php
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
\Barryvdh\Cors\HandleCors::class,
\App\Http\Middleware\Locale::class,
];
Note: the code wihout Auth is executing this block of code but the second isn't
我是不是遗漏了什么?
你有第二个
$response = $next($request);
在最开始,所以代码会在response
执行。
你需要做这样的事情:
public function handle($request, Closure $next)
{
$HQ = Branch::where('is_hq', 1)->where('is_active', 1)->where('user_id', \Auth::id())->first();
$Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
$locale = strtolower($Company['bi__language']->value);
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
return $next($request);
}
如果没有auth()->user()
,那是因为你注册中间件的地方不对。
全局中间件堆栈在会话启动和身份验证详细信息可用之前运行。
在 'web' 组底部或您的路由中间件中定义它。
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Locale::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
我有这个 Locale 中间件,它根据 DB 上的设置设置语言
public function handle($request, Closure $next)
{
$HQ = Branch::where('is_hq', 1)->where('is_active', 1)->first();
$Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
$locale = strtolower($Company['bi__language']->value);
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
return $next($request);
}
但我需要获取当前用户所在的分支,所以我需要先获取 Auth::id() 所以我将代码更改为此以访问 Auth .
public function handle($request, Closure $next)
{
$response = $next($request);
$HQ = Branch::where('is_hq', 1)->where('is_active', 1)->where('user_id', \Auth::id())->first();
$Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
$locale = strtolower($Company['bi__language']->value);
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
return $response;
}
现在我正在让当前用户登录,但问题是它没有执行这段代码
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
Kernel.php
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
\Barryvdh\Cors\HandleCors::class,
\App\Http\Middleware\Locale::class,
];
Note: the code wihout Auth is executing this block of code but the second isn't
我是不是遗漏了什么?
你有第二个
$response = $next($request);
在最开始,所以代码会在response
执行。
你需要做这样的事情:
public function handle($request, Closure $next)
{
$HQ = Branch::where('is_hq', 1)->where('is_active', 1)->where('user_id', \Auth::id())->first();
$Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
$locale = strtolower($Company['bi__language']->value);
if ($locale === 'eng') {
\App::setlocale('en');
} else {
\App::setlocale($locale);
}
return $next($request);
}
如果没有auth()->user()
,那是因为你注册中间件的地方不对。
全局中间件堆栈在会话启动和身份验证详细信息可用之前运行。
在 'web' 组底部或您的路由中间件中定义它。
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Locale::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];