段没有转移/无法在 Controller 中获得正确的参数

Segments are not getting shifted / Cannot get correct arguments in Controller

我正在尝试为现有 Laravel 项目实施简单的本地化。

根据以下教程实施本地化:
https://laraveldaily.com/multi-language-routes-and-locales-with-auth/

这里是本地化实现前的简化代码:

web.php

Route::get('/poll/{poll_id}', 'App\Http\Controllers\PollsController@view');

PollsController@view

public function view($poll_id){
    echo "poll_id: ".$poll_id;
}

测试

URL: http://domain.name/poll/1

结果:poll_id:1

以下是本地化所需的简化更改以及我得到的结果:

web.php

Route::group(['prefix' => '{locale}', 'where' => ['locale' => '[a-zA-Z]{2}'], 'middleware' => 'setlocale'], function() {    
    Route::get('/poll/{poll_id}', 'App\Http\Controllers\PollsController@view');
});

Middleware/SetLocale

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SetLocale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next){
        app()->setLocale($request->segment(1));
        return $next($request);
    }
}

PollsController@view 保持不变。

现在,当我打开下面的URL(http://domain.name/en/poll/1)时,结果是:

结果:poll_id:en

问题

有没有办法忽略控制器中的“'prefix' => '{locale}'”或以某种方式改变参数,以便在控制器中我仍然得到 poll_id =1,不是 locale=en?

PS。最简单的解决方法是通过以下方式向 PollsController@view 添加另一个参数,但它闻起来不太好,然后我需要向所有函数添加 locale 参数,尽管我没有在那里使用它:

public function view($locale, $poll_id){
    echo "poll_id: ".$poll_id;
}

在您的中间件中,您可以告诉 Route 实例忘记该路由参数,这样它就不会尝试将其传递给路由操作:

public function handle($request, $next)
{
    app()->setLocale($request->route('locale'));

    // forget the 'locale' parameter
    $request->route()->forgetParameter('locale');

    return $next($request);
}