You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:44:57