中间件无法在Laravel中获取路由参数



这是我的代码:路线:

Route::get('lang/change', [LangController::class, 'change'])->name('changeLang');

nav.blade.php

<div class="col-md-2 col-md-offset-6 text-right">
<strong>Select Language: </strong>
</div>
<div class="col-md-4">
<select class="form-control changeLang">
<option value="en" {{ session()->get('locale') == 'en' ? 'selected' : '' }}>English</option>
<option value="ar" {{ session()->get('locale') == 'ar' ? 'selected' : '' }}>Arabic</option>
</select>
</div>
@endauth
</ul>
</div>
<span class="text-white">{{ auth()->user() !=null ? auth()->user()->name : "Guest" }}</span>
</div>
</nav>
<script type="text/javascript">
var url = "{{ route('changeLang') }}";
$(".changeLang").change(function(){
window.location.href = url + "?lang="+ $(this).val();
});
</script>

这是中间件:(我已经在内核中注册了web中间件:

public function handle(Request $request, Closure $next)
{
if (session()->has('locale')) {
App::setLocale(session()->get('locale'));
}
return $next($request);
}

要传递的参数是什么?我只看到没有参数的route-url

如果你愿意,你可以签出这个url或者从laravel文档中签出这个块

有时候你可能需要指定一个不需要的路由参数总是出现在URI中。您可以通过放置一个?马克在参数名称。确保给出相应的路由变量a默认值:

Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});

我猜你也会使用最新版本的Laravel这里是带参数路由的文档链接转到文档

这里是你可以找到我的片段的确切标签Laravel Params

你的情况有点小误会。

你的路由不接受任何参数,你正在处理请求。在您的情况下,解决方案应该是下一个:

$language = $request->query('lang');
if (null !== $language) {
App::setLocale($language);
}
return $next($request);

终于解决了这个问题,现在您可以在中间件中获得lang参数

web.php

<?php
use IlluminateSupportFacadesRoute;
use AppHttpMiddlewareMyMiddleware;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::middleware([MyMiddleware::class])->group(function () {
Route::get('lang/change', function () {
return view('welcome');
})->name('changeLang');
});

welcome.blade.php

<div class="col-md-2 col-md-offset-6 text-right">
<strong>Select Language: </strong>
</div>
<div class="col-md-4">
<select class="form-control changeLang">
<option value="en" {{ $_GET['lang'] == 'en' ? 'selected' : '' }}>English</option>
<option value="ar" {{ $_GET['lang'] == 'ar' ? 'selected' : '' }}>Arabic</option>
</select>
</div>
{{-- @endauth --}}
</ul>
</div>
{{-- <span class="text-white">{{ auth()->user() !=null ? auth()->user()->name : "Guest" }}</span> --}}
</div>
</nav>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var url = "{{ route('changeLang') }}";
$(".changeLang").change(function(){
window.location.href = url + "?lang="+ $(this).val();
});
</script>

MyMiddleware.php

<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class MyMiddleware
{
/**
* Handle an incoming request.
*
* @param  IlluminateHttpRequest  $request
* @param  Closure(IlluminateHttpRequest): (IlluminateHttpResponse|IlluminateHttpRedirectResponse)  $next
* @return IlluminateHttpResponse|IlluminateHttpRedirectResponse
*/
public function handle(Request $request, Closure $next)
{
// you can use 
print_r($_GET);
// or you can use this also 
print_r($request->query('lang'));
// or you can use this also 
print_r($request->all());

return $next($request);
}
}

最新更新