我设置了一些自定义中间件,可以根据某些优先级设置本地化。中间件按预期工作......但我无法让它停止!我尝试放入一些逻辑来标记区域设置已设置,但在我的日志中,它仍然继续触发。我使用 Livewire,每次表单提供反馈时,它都会执行此操作。这是中间件类。具体问题围绕“设置已运行标志”的逻辑。
class Localization {
private array $validLocales;
public function __construct() {
# Get Active Locales - From Locale Model
$this->validLocales = Locale::getActiveLocales();
}
public function handle(Request $request, Closure $next): Response {
# Set Already Run Flag
if ($request->has('localeSet')) {
# Debug
DebugLog('info', '[MW - Localization] Middleware already run, skipping.', [], 'init');
return $next($request);
}
# Check Session
$locale = $request->session()->get('locale');
if ($locale) {
App::setLocale($locale);
$request->attributes->set('localeSet', true);
DebugLog('info', '[MW - Localization] Locale set from session.', ['locale' => $locale], 'init');
return $next($request);
}
# REDACTED - Redundant to Question
# Default to English
App::setLocale('en');
Session::put('locale', 'en');
$request->attributes->set('localeSet', true);
DebugLog('info', '[MW - Localization] Locale set to default.', ['locale' => 'en'], 'init');
return $next($request);
}
}
以及一些日志的示例:
[2023-10-19 16:16:21] local.INFO: [MD|QY - Locale] Successfully fetched and cached active locales. {"locales":{"en":{"locale_initials":"en","english_name":"English","native_name":"English"},"zh-CN":{"locale_initials":"zh-CN","english_name":"Mandarin Chinese","native_name":"普通话"}}}
[2023-10-19 16:16:21] local.INFO: [MW - Localization] Locale set from session. {"locale":"zh-CN"}
[2023-10-19 16:16:21] local.INFO: Successfully prepared locale menu. {"locales":{"English":"English","普通话":"Mandarin Chinese"},"localeMapping":{"en":"English","zh-CN":"Mandarin Chinese"}}
[2023-10-19 16:16:23] local.INFO: [MW - Localization] Locale set from session. {"locale":"zh-CN"}
[2023-10-19 16:16:23] local.INFO: [MW - Localization] Locale set from session. {"locale":"zh-CN"}
[2023-10-19 16:16:25] local.INFO: [MW - Localization] Locale set from session. {"locale":"zh-CN"}
谢谢!
每次在相关路由上发出请求时,中间件都会运行,这是正常的。因此,如果中间件应用于一组路由,则每次在任何这些路由上发出请求时都会应用该中间件,这是正常行为。
因此,当在任何相关路由上发出请求时,中间件将始终运行,并且中间件的责任是在需要时对请求进行更改或让请求继续进行下一步。
更好的中间件设计是最后只包含一个
return $next($request);
,任何需要的更改都可以在它之前完成。
我重写了你的代码来说明我的意思。
class Localization {
private array $validLocales;
public function __construct() {
# Get Active Locales - From Locale Model
$this->validLocales = Locale::getActiveLocales();
}
public function handle(Request $request, Closure $next): Response {
if (!$request->has('localeSet')) {
# Check Session
$locale = $request->session()->get('locale');
if ($locale) {
App::setLocale($locale);
$request->attributes->set('localeSet', true);
DebugLog('info', '[MW - Localization] Locale set from session.', ['locale' => $locale], 'init');
}else{
# Default to English
App::setLocale('en');
Session::put('locale', 'en');
$request->attributes->set('localeSet', true);
DebugLog('info', '[MW - Localization] Locale set to default.', ['locale' => 'en'], 'init');
}
}
return $next($request);
}
}