段没有转移/无法在 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);
}
我正在尝试为现有 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);
}