Files
lotteryLaravel/app/Http/Middleware/NegotiateLotteryLocale.php

35 lines
1.3 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use App\Support\LotteryLocale;
use Symfony\Component\HttpFoundation\Response;
/**
* 【API 语言协商中间件】
*
* - 挂载位置bootstrap/app.php 中对 api 分组 prepend所有 /api/* 请求都会先执行本中间件。
* - 职责:解析客户端语言 → 写入 $request->attributes['lottery_locale'] → 调用 app()->setLocale()
* 便于 trans()、LotteryMessage 及后续按 zh/en/ne 选库表文案列时使用。
*
* 【协商顺序】① 请求头 X-Locale必须为 config 支持的 zh/en/ne 之一);② Accept-Language 首选项;③ fallback。
*
* 【与前端】浏览器或 App 可直接带 X-Locale或仅靠 Accept-Language无需前端维护文案 JSON。
*
* 【与异常 JSON】{@see LotteryLocale} 与 middleware 同源,在未命中路由、`lottery_locale` 未写入时仍可从 Header 推导。
*/
final class NegotiateLotteryLocale
{
public function handle(Request $request, Closure $next): Response
{
$locale = LotteryLocale::resolve($request);
// attribute 名称固定为 lottery_locale与 Request::lotteryLocale() 宏一致
$request->attributes->set('lottery_locale', $locale);
app()->setLocale($locale);
return $next($request);
}
}