Laravel 可选路由参数不起作用

问题描述 投票:0回答:1

我必须使用 Laravel 11 设置多语言应用程序,这是我第一次在 Laravel 中使用多语言功能,我不会使用任何包,我会手动设置它,所以我准备了 web.php 文件像这样:

Route::group(['middleware' => ['setLocale']], function () {
    Route::get('/products/{slug}', [ProductController::class, 'fetchProduct']);
});
Route::group(['middleware' => ['setLocale'], 'prefix' => '{locale?}', 'where' => ['locale' => 'en|fr|de|jp']], function () {
    Route::get('/', LandingController::class);
    Route::get('/products/{slug}', [ProductController::class, 'fetchProduct']);
});

当我访问“/products/fr/exemple-product”时,它可以工作,但是当我尝试访问如下所示的默认路由时:“/products/exemple-product”,它不起作用并处理错误:

Too few arguments to function App\\Http\\Controllers\\Front\\ProductController::fetchProduct(), 1 passed in C:\\...\\ControllerDispatcher.php on line 46 and exactly 2 expected 

这是

fetchProduct
方法的定义:

public function fetchProduct($locale = null, $slug) {dd($slug);}

即使我将

$locale
设置为 null,也不起作用。

php laravel routes multilingual
1个回答
0
投票

在必填参数之前不能有可选参数,即不能有

($lang = null, $slug)

交换它们是不行的,因为在这种情况下,laravel 根据参数在 url 中出现的顺序注入参数。

解决方案可能是为具有不同参数的路线创建一个单独的函数。更好的解决方案是使用诸如 mcamara/laravel-localization 之类的包来为您处理此需求。

routes.php

Route::group(['middleware' => ['setLocale']], function () {
    Route::get('/products/{slug}', [ProductController::class, 'fetchProductWithoutLocale']);
});

Route::group(['middleware' => ['setLocale'], 'prefix' => '{locale?}', 'where' => ['locale' => 'en|fr|de|jp']], function () {
    Route::get('/products/{slug}', [ProductController::class, 'fetchProduct']);
});

控制器.php

public function fetchProduct($locale, $slug) {dd($slug);}

public function fetchProductWithoutLocale($slug) {
  $locale = config('app.fallback_locale'); // or your logic to retrieve a default

  return $this->fetchProduct($locale, $slug);
}
© www.soinside.com 2019 - 2024. All rights reserved.