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

fslejnso  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(153)

这是我的代码:路线:

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);
}
g9icjywg

g9icjywg1#

你传递的参数是什么。我看到的都是没有参数的route-url
如果你愿意,你可以 checkout 这个URL,或者直接从Laravel文档中检查这个块
有时候,您可能需要指定一个路由参数,而该参数可能并不总是出现在URI中。您可以通过放置?参数名称后的标记。确保给予路由的相应变量指定默认值:

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

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

我假设你也在使用最新版本的Laravel,这里是使用参数Go To Docs进行路由的文档链接。
这里是确切的标签,你可以找到我的片段Laravel参数

deyfvvtc

deyfvvtc2#

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

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

    return $next($request);
qv7cva1a

qv7cva1a3#

终于解决了这个问题,现在你可以在中间件中获取lang参数了
web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Middleware\MyMiddleware;

/*
|--------------------------------------------------------------------------
| 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 App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class MyMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    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);
    }
}

相关问题