Laravel本地化路由:控制器无需传递$locale参数的实现方案
解决方案:移除路由参数中的
locale,避免控制器方法接收该参数 你可以在SetLocale中间件中完成语言环境设置后,将locale从路由参数集合中移除,这样控制器方法就无需再声明$locale参数。
修改后的中间件代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\URL; use Symfony\Component\HttpFoundation\Response; class SetLocale { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { $locale = $request->segment(1); app()->setLocale($locale); URL::defaults(['locale' => $locale]); // 从路由参数中移除locale,控制器方法将不再需要接收该参数 $request->route()->forgetParameter('locale'); return $next($request); } }
修改完成后,控制器方法即可按期望的写法定义:
public function show(Slot $slot) { return view('slots.show', [ 'slot' => $slot, ]); }
原理说明
$request->route()->forgetParameter('locale')会把路由中定义的{locale}参数从当前请求的路由参数集合中移除,Laravel解析控制器方法参数时,就不会再尝试注入该参数。- 语言环境已经在中间件中完成设置,后续业务逻辑中如果需要获取当前语言,直接调用
app()->getLocale()即可,完全不需要在控制器中重复处理。
内容的提问来源于stack exchange,提问作者Merha
相关产品推荐
相关产品推荐

